python3 [入门基础实战] 爬虫入门之xpath爬取脚本之家python栏目

本文主要是介绍python3 [入门基础实战] 爬虫入门之xpath爬取脚本之家python栏目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这次爬取的确实有些坎坷,经过了两个晚上吧,最后一个晚上还是爬取数据到最后一公里了,突然报错了。又得继续重新进行爬取


先来个爬取结果图,这次爬取的是标题,url,还有日期,估计也就只有这么多内容,用的单线程,

爬取结果:
这里写图片描述

爬取的过程很蛋疼,最后是昨天晚上爬取出来的,下次争取不用单线程进行任务了。

先来份代码:

# -*- coding: UTF-8 -*-
import threading  # 导入threading包
from lxml import etree
import requests
import re
import chardet
from  openpyxl import Workbook
import time
# 脚本之家baseUrl = 'http://www.jb51.net/list/list_97_1.htm'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400'}pageNum = 1  # 用来计算爬取的页数
wb = Workbook()
ws = wb.active
ws.title = '脚本之家脚本python专栏'
ws.cell(row=1, column=1).value = '标题'
ws.cell(row=1, column=2).value = '链接'
ws.cell(row=1, column=3).value = '日期'def getHtml(url):req = requests.get(url, headers)# print('html:'+req.text.encode(req.encoding).decode('gb2312'))return req.text.encode(req.encoding).decode('gb2312')def etreeMyHtml(html):global pageNumprint('******' * 40)html = etree.HTML(html)result = etree.tostring(html, pretty_print=True, encoding='gb2312')# 因为每页有四十页for page in range(1, 41):# 标题title = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/a/text()' % page)# 日期timeData = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/span/text()' % page)# 链接(因为用的是相对链接,所以要加上:http://www.jb51.net)nextUrl = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/a/@href' % page)print('str1=== ' + str(title[0]))print('timeData=== ' + str(timeData[0]))nextUrl = 'http://www.jb51.net' + nextUrl[0]print('nextUrl=== ' + str(nextUrl))# ver_info = list(zip(title[0],nextUrl,timeData[0]))pageNum = pageNum + 1ws.cell(row=pageNum, column=1).value = title[0]ws.cell(row=pageNum, column=2).value = nextUrlws.cell(row=pageNum, column=3).value = timeData[0]# print('中文')
# data = getHtml(baseUrl)
# etreeMyHtml(data)
# print('中文')def start(page1,page2):try:for i in range(page1, page2):mUrl = 'http://www.jb51.net/list/list_97_%s.htm' % iprint('url ' + mUrl)data = getHtml(mUrl)etreeMyHtml(data)except:print('error '+i)finally:wb.save('脚本之家脚本python专栏' + '.xlsx')def task1():print('task1 start...')start(1,71)
def task2():print('task2  init...')start(71,153)# print("多线程:")
# starttime = time.time();  # 记录开始时间
# threads = []  # 创建一个线程列表,用于存放需要执行的子线程
# t1 = threading.Thread(target=task1)  # 创建第一个子线程,子线程的任务是调用task1函数,注意函数名后不能有()
# threads.append(t1)  # 将这个子线程添加到线程列表中
# t2 = threading.Thread(target=task2)  # 创建第二个子线程
# threads.append(t2)  # 将这个子线程添加到线程列表中
#
# for t in threads:  # 遍历线程列表
#     t.setDaemon(True)  # 将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起
#     t.start()  # 启动子线程
# endtime = time.time();  # 记录程序结束时间
# totaltime = endtime - starttime;  # 计算程序执行耗时
# print("耗时:{0:.5f}秒".format(totaltime));  # 格式输出耗时
# print('---------------------------')# 以下为普通的单线程执行过程,不需解释
print("单线程:")
starttime = time.time();
start(1,153)
endtime = time.time();
totaltime = endtime - starttime;
print("耗时:{0:.5f}秒".format(totaltime));

总结一下:

遇到的坑:脚本之家的编码是gb2312,首次使用xpath,用完感觉还不错,比正则耗时少了,主要是直接浏览器F2,然后选中元素右键copy->xpath 就可以了, 而且上一篇文章写的很清楚,也比较容易入门

  1. 得到源网页:

def getHtml(url):req = requests.get(url, headers)# print('html:'+req.text.encode(req.encoding).decode('gb2312'))return req.text.encode(req.encoding).decode('gb2312')

  • 通过xpath进行相应的数据进行解析

def etreeMyHtml(html):global pageNumprint('******' * 40)html = etree.HTML(html)# result = etree.tostring(html, pretty_print=True, encoding='gb2312')# 因为每页有四十页for page in range(1, 41):# 标题title = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/a/text()' % page)# 日期timeData = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/span/text()' % page)# 链接(因为用的是相对链接,所以要加上:http://www.jb51.net)nextUrl = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/a/@href' % page)print('str1=== ' + str(title[0]))print('timeData=== ' + str(timeData[0]))nextUrl = 'http://www.jb51.net' + nextUrl[0]print('nextUrl=== ' + str(nextUrl))# ver_info = list(zip(title[0],nextUrl,timeData[0]))pageNum = pageNum + 1ws.cell(row=pageNum, column=1).value = title[0]ws.cell(row=pageNum, column=2).value = nextUrlws.cell(row=pageNum, column=3).value = timeData[0]

  • 使用try except finaly 进行数据的爬取,这样保证在最后也能进行数据的保存

def start(page1,page2):try:for i in range(page1, page2):mUrl = 'http://www.jb51.net/list/list_97_%s.htm' % iprint('url ' + mUrl)data = getHtml(mUrl)etreeMyHtml(data)except:print('error '+i)finally:wb.save('脚本之家脚本python专栏' + '.xlsx')

这次是失业了, 确实公司比较小,发工资都是老板亲手来发工资,遇到个京东众筹,资金又暂时的周转不过来,只能先把我这来了半年不到的小喽啰给裁掉咯。以后android 可能会慢慢放弃,转向大数据方向吧。python,你用你知道爽。下次学习招聘网站的爬取,因为自己要找工作了嘛。

这篇关于python3 [入门基础实战] 爬虫入门之xpath爬取脚本之家python栏目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/606344

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型: