案例_(单线程)使用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爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
随机推荐
- HTML定位——绝对定位和相对定位、固定定位
1.绝对定位 绝对定位指的是通过规定HTML元素在水平和垂直方向上的位置来固定元素,基于绝对定位的元素不会占据空间. 绝对定位的位置声明是相对于已定位的并且包含关系最近的祖先元素.如果当前需要被定为的 ...
- PTA A1003&A1004
第二天 A1003 Emergency (25 分) 题目内容 As an emergency rescue team leader of a city, you are given a specia ...
- ActiveMQ JMX使用
一.说明 ActiveMQ使用过程中,可以使用自带的控制台进行相关的操作以及查看,但是当队列数相当多的时候,在查询以及整体的监控上,就可能相当的不便.所以可通过JMX的方式,进行MQ中队列相关指标的以 ...
- @Data注解getset不起作用
在idea的setting安装Lombok插件,重启idea
- java实现图片验证码
一.验证码生成类 package hbi.tech.utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.im ...
- 【SQL server初级】SQL Server 2005 实现数据库同步备份 过程--结果---分析
数据库复制: 简单来说,数据库复制就是由两台服务器,主服务器和备份服务器,主服务器修改后,备份服务器自动修改. 复制的模式有两种:推送模式和请求模式,推送模式是主服务器修改后,自动发给备份服务器, ...
- 关于Python selenium实现类似比价软件的功能
偶然间想实现比价的功能,正常requests途径比较难实现,于是乎想到可以selenium可以简易实现,下面是代码. import requests from selenium import webd ...
- php7和php5区别是什么
PHP7距正式发布以及有挺长时间了,刚出道就号称比旧版本快了几倍,各种开源框架或系统运行在PHP7上速度效率提高了几倍.那么php7和php5之间的区别是什么?下面本篇文章就来给大家简单介绍一下,希望 ...
- js常用Matn函数的操练
Math.PI console.log(Math.PI); 随机数以及向下取整 这是一个能实现从a-b之间随机打印一个整数 function rand_s(a, b) { var x = a + (b ...
- [Note] 使用Code Snippet简化编码
使用NewtonSoft.Json写实体类时大量格式一致的代码出现 ,这时可以使用Code snippet来加快编码速度 [JsonProperty(PropertyName = "mess ...