案例_(单线程)使用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爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
随机推荐
- DirectX12 3D 游戏开发与实战第二章内容
矩阵代数 学习目标 理解矩阵及其相关运算的定义 探究为何能把向量和矩阵的乘法视为一种线性组合 学习单位矩阵.转置矩阵.行列式以及矩阵的逆等概念 逐步熟悉DirectXMath库中提供的关于矩阵计算的类 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- 42 (OC)* 字典实现原理--哈希原理
一.NSDictionary使用原理 1.NSDictionary(字典)是使用 hash表来实现key和value之间的映射和存储的,hash函数设计的好坏影响着数据的查找访问效率. - (void ...
- 最近学习到的Lambda表达式
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 中秋去了躺上海,在外滩上打了个卡: 紧接着学了一下J ...
- mysql8.0版本忘记root密码
1.先关掉系统服务 net stop mysql 2.进入mysql安装目录的bin文件中,以管理员的方式运行cmd,然后输入如下命令,实现无密码登陆 mysqld --console --skip- ...
- @RequestMapping 用法详解之地址映射(转)
这段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/js ...
- SpringBootSecurity学习(11)网页版登录之URL动态权限
动态权限 前面讨论用户登录认证的时候,根据用户名查询用户会将用户拥有的角色一起查询出来,自动实现判断当前登录用户拥有哪些角色.可以说用户与角色之间的动态配置和判断security做的非常不错.不过在配 ...
- mysql 对返回字段进行拼接
使用concat函数进行拼接:示例如下: select id,username,concat( id, '-' , username) as idName from user;
- Nginx+PHP7.3.9 Docker镜像制作
最近因项目需要制作了多个版本的php docker镜像,制作过程可谓是一波三折,因基于yum的方式安装php的方式在安装扩展插件时很不方便,不容易找到插件对应的yum源,所以PHP在docker镜像中 ...
- grep、正则表达式
1.grep :文本搜索工具 -i:忽略大小写--color:匹配到的内容高亮显示-v:显示没有被模式匹配到的行-o:只显示被模式匹配到的字符串-n:显示匹配到行的行号-E:使用扩展正则表达式-A:后 ...