案例_(单线程)使用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爬取糗事百科的更多相关文章

  1. Xpath--使用Xpath爬取糗事百科成人版图片

    #!usr/bin/env python#-*- coding:utf-8 _*-"""@author:Hurrican@file: 爬取糗事百科.py@time: 20 ...

  2. 爬取糗事百科热门段子的数据并保存到本地,xpath的使用

    和之前的爬虫类博客的爬取思路基本一致: 构造url_list,因为糗事百科的热门栏目默认是13页,所以这个就简单了 遍历发送请求获取响应 提取数据,这里用的是xpath提取,用的是Python的第三方 ...

  3. 16-多线程爬取糗事百科(python+Tread)

    https://www.cnblogs.com/alamZ/p/7414020.html   课件内容 #_*_ coding: utf-8 _*_ ''' Created on 2018年7月17日 ...

  4. python爬虫之爬取糗事百科并将爬取内容保存至Excel中

    本篇博文为使用python爬虫爬取糗事百科content并将爬取内容存入excel中保存·. 实验环境:Windows10   代码编辑工具:pycharm 使用selenium(自动化测试工具)+p ...

  5. python_爬虫一之爬取糗事百科上的段子

    目标 抓取糗事百科上的段子 实现每按一次回车显示一个段子 输入想要看的页数,按 'Q' 或者 'q' 退出 实现思路 目标网址:糗事百科 使用requests抓取页面  requests官方教程 使用 ...

  6. 8.Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  7. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  8. python学习(十六)写爬虫爬取糗事百科段子

    原文链接:爬取糗事百科段子 利用前面学到的文件.正则表达式.urllib的知识,综合运用,爬取糗事百科的段子先用urllib库获取糗事百科热帖第一页的数据.并打开文件进行保存,正好可以熟悉一下之前学过 ...

  9. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

随机推荐

  1. Spring Boot (三): ORM 框架 JPA 与连接池 Hikari

    前面两篇文章我们介绍了如何快速创建一个 Spring Boot 工程<Spring Boot(一):快速开始>和在 Spring Boot 中如何使用模版引擎 Thymeleaf 渲染一个 ...

  2. Qt线程实现分析-moveToThread vs 继承

    最近抽空研究了下QThread,使用起来方式多种多样,但是在使用的同时,我们也应该去了解Qt的线程它到底是怎么玩儿的. Qt的帮助文档里讲述了2种QThread的使用方式,一种是moveToThrea ...

  3. C++消息框架-基于sigslot

    目录 一.简介 二.消息 三.发送者 1.发送消息函数 2.新增一个接收者函数 3.移除一个接收者函数 四.接收者 五.功能测试 1.消息接收类 2.测试代码 3.测试结果 六.源码 一.简介 上一篇 ...

  4. SpringBoot起飞系列-日志使用(四)

    一.SpringBoot中的日志组件 日志是一个系统中不可缺少的组件.在项目中,我们常用的日志组件有JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.. ...

  5. mongodb 获取自增数

    mongodb db.getCollection('user').findAndModify({update:{$inc:{'level':1}},query:{"name":&q ...

  6. Hadoop点滴-何时使用hadoop fs、hadoop dfs与hdfs dfs命令

    何时使用hadoop fs.hadoop dfs与hdfs dfs命令 编辑 删除 hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件 ...

  7. 88.CSS---Grid 网格布局教程

    grid 兼容性查看请点此处 最新Grid兼容 grid 布局就是给父元素(容器)添加display:grid,然后使子元素(项目)改变布局, 1 2 3 4 5 6 7 8 9 上面九个正方形的代码 ...

  8. 转载:Docker入门只需看这一篇就够了

    最近项目中需要用到 Docker 打包,于是上网查找资料学习了 Docker 的基本命令,记录一下自己遇到的一些错误. 准备开始自己写,结果看到了阮一峰老师的文章,瞬间就没有写下去的动力了,转载大佬的 ...

  9. Python 正则re匹配中文、英式数字

    #coding:utf-8 import re s = u''' 或多或少的好好读书电锯惊魂20202 和水电费后是否会时候1212没收到风10.12海大富的是粉红色的和办法的1244525.000 ...

  10. 让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...