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 就可以了, 而且上一篇文章写的很清楚,也比较容易入门
- 得到源网页:
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栏目相关推荐
- python3 [入门基础实战] 爬虫入门之爬取豆瓣阅读中文电子书[热门排序]
稍微总结一下: 今天爬的稍微有点打击士气了,但是还是学到了不少东西, 告诉我们,要学会自己去百度,谷歌答案, 自己去思考,不要依赖一些技术交流QQ群,很多都是水群的, 真的帮助你的是很少的. 重点在这 ...
- 爬虫基础练习: 基于 java + Jsoup + xpath 爬取51job网站
最基本的网页爬虫练习 爬取51jb网站,并将数据写入Excel中 需要导入jsoup包和POI相关包 JSoup简介 jsoup是一款Java的HTML解析器,主要用来对HTML解析, 可通过DOM, ...
- Python爬虫如何实用xpath爬取豆瓣音乐
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...
- python爬虫利用Scrapy框架爬取汽车之家奔驰图片--实战
先看一下利用scrapy框架爬取汽车之家奔驰A级的效果图 1)进入cmd命令模式下,进入想要存取爬虫代码的文件,我这里是进入e盘下的python_spider文件夹内 C:\Users\15538&g ...
- 在当当买了python怎么下载源代码-爬虫实战一:爬取当当网所有 Python 书籍
图片来自 unsplash 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实践来检验学习成果.因此,本文主要讲解如何利用我们刚才的几个库去实 ...
- python爬虫爬当当网_爬虫实战一:爬取当当网所有 Python 书籍
本文转载自微信公众号[ 极客猴 ],作者知乎主页 此前错误标注来源导致侵权,在此表示歉意. 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实 ...
- python3[爬虫实战] 使用selenium,xpath爬取京东手机(下)
这次主要是进行京东具体某个店铺手机评论内容的爬取. 本来是跟上一起写的,只是没有时间一块做总结,现在写上来是有点生疏了.这里是暂时获取一个商品的评论内容 爬取的字段:评论内容,购买机型,评论人 上代码 ...
- Python爬虫之利用xpath爬取ip代理网站的代理ip
爬虫工具 python3 pycharm edge/chrome requests库的用法 requests库是python中简单易用的HTTP库 用命令行安装第三方库 pip install req ...
- 爬虫爬评书吧_爬虫学习:xpath爬取评书网
在家闲着,想找点评书听,但找了很久都没找到方便打包下载的地方.于是就拿起自学的python爬虫,自己动手丰衣足食. 运行环境:Windows7,python3.7 操作步骤: 1.打开选好的评书主页面 ...
最新文章
- GoAccess安装及分析nginx实时日志
- 卷积神经网络(cnn) 手写数字识别
- GetMemeory(char *p);GetMemeory(char **p);char* GetMemeory()用法!
- Response对象学习
- How AET fields are retrieved from backend
- Visual Studio 2017 15.5.0 正式发布 正式版下载
- python运算符号输入_【Python】【运算符】
- 思科 GNS3 配置 NAT 端口映射
- Slickflow.NET 开源工作流引擎高级开发(四) -- 硬核编码:代码式快速构建流程图...
- Edraw Max(亿图图示):新手如何快速美化思维导图?
- 大学计算机基础知识电子版,(完整版)大一大学计算机基础课程知识点.pdf
- 矢量文字符号文件格式设计
- win7与internet时间同步出错_时间同步出错,教您时间同步出错
- springmvc+mybatis 无极限树形结构 Mapperxml 映射方法
- PlayYou 捉弄人软件(手机控制电脑)
- 计算机专业 中职学校顶岗实习学校总结,中职学校顶岗实习论文(2)
- 怎么录制屏幕视频?高效便捷方法在这里
- 【翻译】Dremel: Interactive Analysis of WebScale Datasets
- 10个最常见的HTML5面试题及答案
- 电口以太网物理层一致性测试原理与过程