1.糗事百科段子.py

# 目标:爬取糗事百科段子信息(文字)
# 信息包括:作者头像,作者名字,作者等级,段子内容,好笑数目,评论数目
# 解析用学过的几种方法都实验一下①正则表达式.②BeautifulSoup③xpath
import requests
import re # 正则表达式
import json
from bs4 import BeautifulSoup # BS
from lxml import etree # xpath def get_one_page(url):
response = requests.get(url)
if response.status_code == 200:
return response.text
return None def zhengze_parse(html):
pattern = re.compile(
'<img src="//(.*?)".*?alt="(.*?)".*?<a.*?<div class=".*?">(.*?)</div>'
+ '.*?<div class=.*?<span>(.*?)</span>.*?<span class=".*?".*?<i.*?>(.*?)<'
+ '.*?<i.*?>(.*?)<',
re.S)
items = re.findall(pattern, html)
for item in items:
content = item[3].replace('<br/>', '').strip()
content = content.replace('\x01', '')
if item[5] == '京公网安备11010502031601号':
break
yield {
'image': "http://" + item[0],
'name': item[1],
'grade': item[2],
'content': content,
'fun_Num': item[4],
'com_Num': item[5]
} def soup_parse(html):
soup = BeautifulSoup(html, 'lxml')
for data in soup.find_all('div', class_='article'):
image = "http:" + data.img['src']
name = data.img['alt']
# 匿名用户没有等级
if name=="匿名用户":
grade = "匿名用户"
else:
grade = data.find('div', class_='articleGender').text
content = data.find('div', class_='content').span.text.strip()
fun_Num = data.find('i', class_='number').text
com_Num = data.find('a', class_='qiushi_comments').i.text yield {
'image': image,
'name': name,
'grade': grade,
'content': content,
'fun_Num': fun_Num,
'com_Num': com_Num,
} def xpath_parse(html):
html = etree.HTML(html)
for data in html.xpath('//div[@class="col1"]/div'):
image = "http:"+ str(data.xpath('.//img/@src')[0])
name = data.xpath('.//img/@alt')[0]
if name == '匿名用户':
grade = '匿名用户'
else:
grade = data.xpath('./div[1]/div/text()')[0]
content = data.xpath('./a/div/span/text()')[0:]
content = str(content).strip().replace('\\n','')
fun_Num = data.xpath('./div[2]/span[1]/i/text()')[0]
com_Num = data.xpath('.//div[2]/span[2]/a/i/text()')[0]
# print(image, name, grade, content, fun_Num, com_Num)
yield {
'image': image,
'name': name,
'grade': grade,
'content': content,
'fun_Num': fun_Num,
'com_Num': com_Num,
} def write_to_file(content, flag):
with open('糗百段子(' + str(flag) + ').txt', 'a', encoding='utf-8')as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n') def search(Num):
url = 'https://www.qiushibaike.com/text/page/' + str(Num) + '/'
html = get_one_page(url)
# 正则匹配不到匿名用户的等级,不会匹配匿名用户的段子,所以少一些数据
# 稍微加个判断逻辑就行了,懒得弄了
for item in zhengze_parse(html):
write_to_file(item, '正则表达式') for item in soup_parse(html):
write_to_file(item, 'BS4') for item in xpath_parse(html):
write_to_file(item, 'xpath')
page = str(Num)
print("正在爬取第" + page + '页') def main():
# 提供页码
for Num in range(1, 14):
search(Num)
print("爬取完成") if __name__ == '__main__':
# 入口
main()

  

2.打包

pyinstaller -F 糗事百科段子.py

  

3.运行效果

网页上匿名用户段子的显示情况

<爬虫实战>糗事百科的更多相关文章

  1. 爬虫_糗事百科(scrapy)

    糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...

  2. python scrapy实战糗事百科保存到json文件里

    编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...

  3. Python爬虫_糗事百科

    本爬虫任务: 爬虫糗事百科网站(https://www.qiushibaike.com/)--段子版块中所有的[段子].[投票数].[神回复]等内容 步骤: 通过翻页寻找url规律,构造url列表 查 ...

  4. 手动爬虫之糗事百科(ptyhon3)

    一.调用封装的Url_ProxyHelper类,源码如下 import urllib.request as ur class Url_ProxyHelper: def __init__(self, u ...

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

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

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

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

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

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

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

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...

  9. Python爬虫实战之爬取糗事百科段子【华为云技术分享】

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...

随机推荐

  1. 兼容软件,Wine安装,Crossover安装,

    EL6 (RHEL6 and SL6) Required packages for proper building of 32-bit Wine on 64-bit EL6 yum install - ...

  2. 网页压缩--gzip和deflate的区别

    我们在配置网站GZip压缩的时候,会发现有两个模块可以设置的,一个是GZip模块的参数配置,另一个是Deflate模块的参数配置,他们的设置方法是一样的.刚开始时我不太明白,这两地方有什么不同?网站开 ...

  3. Java8 时间调节器

    TemporalAdjuster 是做日期数学计算.例如,要获得“本月第二个星期六”或“下周二”. 让我们来看看他们的操作. 选择使用任何编辑器创建以下java程序在 C:/> JAVA Jav ...

  4. 时间同步服务器NTP搭建

    NTP服务器        NTP(Network Time Protocol)[网络时间协议],它是用来同步网络中各个计算机的时间的协议,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒, ...

  5. [已解决]报错UnicodeDecodeError

    输出报错: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 220: in 解决方案:将编码方式utf-8 修 ...

  6. layui中下拉框问题

    <div class="layui-form-item"> <label class="layui-form-label">上级栏目:& ...

  7. mtv 与mvc

    1.MVC与MTV模型 MVC模型 Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型 ...

  8. python将字典列表导出为Excel文件的方法

    将如下的字典列表内容导出为Excel表格文件形式: ​ 关于上图字典列表的写入,请参考文章:https://blog.csdn.net/weixin_39082390/article/details/ ...

  9. python接口自动化(响应对象方法)

    python接口自动化(响应对象方法) 一.encoding作用 获取请求的编码(在不设置响应编码时,响应的信息默认使用的是请求的编码格式):r.encoding 设置响应的编码:r.encoding ...

  10. react 点击事件传值

    test(e){ console.log(e.target) } <button onClick={(e)=>{this.test(e)}}></button> 有时要是 ...