案例_(单线程)使用xpath爬取糗事百科
案例_(单线程)使用xpath爬取糗事百科
步骤如下:
首先通过xpath插件找出我们要爬取的信息的匹配规则 url = "https://www.qiushibaike.com/8hr/page/1/" xpath插件的模糊查询:contains(),第一个参数是要匹配的标签,第二个参数是这个标签的部分内容 1.//div[contains(@id,"qiushi_tag_")] 匹配出所有段子包括评论,点赞数 以此作为根节点 2.用户名://div[contains(@id,"qiushi_tag_")]/div[@class="author clearfix"]//h2 3.内容://div[contains(@id,"qiushi_tag_")]//div[@class="content"]/span 4.点赞数://div[contains(@id,"qiushi_tag_")]//span[@class="stats-vote"]/i 5.评论数://div[contains(@id,"qiushi_tag_")]//span[@class="stats-comments"]//i 6.图片链接://div[contains(@id,"qiushi_tag_")]//div[@class="thumb"]//@src 代码如下
from urllib.request import *
import time
from lxml import etree class Spider(object):
def __init__(self):
# 定义一个空列表装所有信息
self.__info = [] # 定义一个字典保存每条段子的信息
self.__item = {} # 用户输入开始页面和结束页面
self.__start_page = int(input("请输入开始爬取的页面:"))
self.__end_page = int(input("请输入结束爬取的页面:")) self.__header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3514.0 Safari/537.36"} def __load_page(self, url):
"""构建request请求,并发起请求"""
request = Request(url, headers=self.__header) # 发送请求获取html源码
# response 为<class 'http.client.HTTPResponse'>对象
# response.read() 为<class 'bytes'>对象
# response.read().decode() 为字符串对象
response = urlopen(request)
html = response.read().decode() # 调用方法使用xpath获取信息
return html def __xpath_get_info(self, html):
"""将HTML字符串解析为HTML DOM格式,并获取相关信息"""
selector = etree.HTML(html) # 返回所有段子的节点位置,contant()模糊查询方法,第一个参数是要匹配的标签,第二个参数是这个标签的部分内容
# 每个节点包括一条完整的段子(用户名,段子内容,点赞,评论等)
node_list = selector.xpath('//div[contains(@id,"qiushi_tag_")]') for node in node_list:
# 爬取所有用户名信息
# 取出标签里的内容,使用.text方法
user_name = node.xpath('./div[@class="author clearfix"]//h2')[0].text # 爬取段子内容,匹配规则必须加点 不然还是会从整个页面开始匹配
# 注意:如果span标签中有br 在插件中没问题,在代码中会把br也弄进来
duanzi_info = node.xpath('.//div[@class="content"]/span')[0].text.strip() # 爬取段子的点赞数
vote_num = node.xpath('.//span[@class="stats-vote"]/i')[0].text # 爬取评论数
comment_num = node.xpath('.//span[@class="stats-comments"]//i')[0].text # 爬取图片链接
# 属性src的值,所以不需要.text
img_url = node.xpath('.//div[@class="thumb"]//@src')
if len(img_url) > 0:
img_url = img_url[0]
else:
img_url = "无图片" self.__save_info(user_name, duanzi_info, vote_num, comment_num, img_url) def __save_info(self, user_name, duanzi_info, vote_num, comment_num, img_url):
"""把每条段子的相关信息写进字典"""
item = {
"username": user_name,
"content": duanzi_info,
"zan": vote_num,
"comment": comment_num,
"image_url": img_url
}
self.__info.append(item) def show_result(self):
"""展示爬取的结果"""
for info in self.__info:
print(info) def run(self):
"""启动爬虫程序"""
for page in range(self.__start_page, self.__end_page + 1):
url = "https://www.qiushibaike.com/8hr/page/" + str(page)
html = self.__load_page(url) # 爬取一页休眠一秒,应对反爬策略
# time.sleep(1)
self.__xpath_get_info(html) if __name__ == '__main__':
qiushi_spider = Spider()
qiushi_spider.run()
qiushi_spider.show_result()
结果预览:

可能出现的问题
问题:一次爬取多个以上页面会出现:urllib.error.HTTPError: HTTP Error 503: Service Temporarily Unavailable
原因: 一种反爬虫机制,即限制了单个ip在固定时间内访问的次数,可以采用切换ip代理解决,如果嫌麻烦可以爬取一页休眠一秒
如果你和我有共同爱好,我们可以加个好友一起交流哈!

案例_(单线程)使用xpath爬取糗事百科的更多相关文章
- Xpath--使用Xpath爬取糗事百科成人版图片
#!usr/bin/env python#-*- coding:utf-8 _*-"""@author:Hurrican@file: 爬取糗事百科.py@time: 20 ...
- 爬取糗事百科热门段子的数据并保存到本地,xpath的使用
和之前的爬虫类博客的爬取思路基本一致: 构造url_list,因为糗事百科的热门栏目默认是13页,所以这个就简单了 遍历发送请求获取响应 提取数据,这里用的是xpath提取,用的是Python的第三方 ...
- 16-多线程爬取糗事百科(python+Tread)
https://www.cnblogs.com/alamZ/p/7414020.html 课件内容 #_*_ coding: utf-8 _*_ ''' Created on 2018年7月17日 ...
- python爬虫之爬取糗事百科并将爬取内容保存至Excel中
本篇博文为使用python爬虫爬取糗事百科content并将爬取内容存入excel中保存·. 实验环境:Windows10 代码编辑工具:pycharm 使用selenium(自动化测试工具)+p ...
- python_爬虫一之爬取糗事百科上的段子
目标 抓取糗事百科上的段子 实现每按一次回车显示一个段子 输入想要看的页数,按 'Q' 或者 'q' 退出 实现思路 目标网址:糗事百科 使用requests抓取页面 requests官方教程 使用 ...
- 8.Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- python网络爬虫--简单爬取糗事百科
刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...
- python学习(十六)写爬虫爬取糗事百科段子
原文链接:爬取糗事百科段子 利用前面学到的文件.正则表达式.urllib的知识,综合运用,爬取糗事百科的段子先用urllib库获取糗事百科热帖第一页的数据.并打开文件进行保存,正好可以熟悉一下之前学过 ...
- Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
随机推荐
- caffe学习二:py-faster-rcnn配置运行faster_rcnn_end2end-VGG_CNN_M_1024 (Ubuntu16.04)
本文的主要目的是学习记录. 原文连接:https://blog.csdn.net/samylee/article/details/51099508 本博客中我将对py-faster-rcnn配置运行f ...
- React-leaflet在ant-design pro中的基本使用
react-leaflet的github地址:https://github.com/PaulLeCam/react-leaflet react-leaflet-markercluster点聚合gith ...
- class命名归类
常见class关键词: 布局类:header, footer, container, main, content, aside, page, section 包裹类:wrap, inner 区块类:r ...
- java数据结构——红黑树(R-B Tree)
红黑树相比平衡二叉树(AVL)是一种弱平衡树,且具有以下特性: 1.每个节点非红即黑; 2.根节点是黑的; 3.每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的; 4.如图所示,如果一个 ...
- 2019-2020学年:Java自学书单(定个小目标)
spring spring技术内幕(回顾+深入) mysql 高性能mysql innoDB (回顾+深入) redis redis实战 redis设计与实现(巩固) 算法 算法第四版 java实现 ...
- WordPress后台地址路径修改方法
用过WordPress后台的,其实都知道http://域名目录/wp-login.php就是登录地址,如果这时候使用暴力破解,很可能破解密码(这就有些想象力了),下面芝麻带你看看如何自定义美观的地址. ...
- 【面试题】Java常见面试题
集合与数组? 数组:(可以存储基本数据类型)是用来存储对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用 集合:(只能存储对象,对象类型可以不一样)集合的长度可变,可在多数情况下使用 ...
- WPS删除多余空白页
WPS删除多余空白页 在实际工作中,我们在操作WPS文字的时候常常会遇到一种问题,就是当在文字占满整页的时候,文档常常会多出一页空白页的现象.如图1 图 1 对于WPS文字怎么删除空白页这个问题, ...
- 利用Python进行数据分析:【Pandas】(Series+DataFrame)
一.pandas简单介绍 1.pandas是一个强大的Python数据分析的工具包.2.pandas是基于NumPy构建的.3.pandas的主要功能 --具备对其功能的数据结构DataFrame.S ...
- 【IT技术概念】什么是webservice?
WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互. WebServi ...