<爬虫实战>糗事百科
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.运行效果

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

<爬虫实战>糗事百科的更多相关文章
- 爬虫_糗事百科(scrapy)
糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...
- python scrapy实战糗事百科保存到json文件里
编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...
- Python爬虫_糗事百科
本爬虫任务: 爬虫糗事百科网站(https://www.qiushibaike.com/)--段子版块中所有的[段子].[投票数].[神回复]等内容 步骤: 通过翻页寻找url规律,构造url列表 查 ...
- 手动爬虫之糗事百科(ptyhon3)
一.调用封装的Url_ProxyHelper类,源码如下 import urllib.request as ur class Url_ProxyHelper: def __init__(self, u ...
- 8.Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- 转 Python爬虫实战一之爬取糗事百科段子
静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...
- Python爬虫实战之爬取糗事百科段子
首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...
- Python爬虫实战之爬取糗事百科段子【华为云技术分享】
首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...
随机推荐
- 服务器安装TeamViewer 13
服务器安装TeamViewer 13 服务器上安装TeamViewer,网上找了个教程开始安装,里面有坑,安装时要根据自己的情况而定.Linux系统更新太快,网上教程可能会有一些出入. TeamVie ...
- 20. Jmeter抓包之APP请求
APP测试过程中我们经常需要抓包,通常我们使用fiddler或者Charles.但是jmeter也可以抓包,而且非常好用,闲话不多说,下面进入正题. 步骤: 1.选择测试计划,添加线程组 2.选择工作 ...
- Nginx 配置参数
1 Proxy_send_timeout 定义后端在多久的时间内必须返回完所有的数据给Nginx. 2 Proxy_read_timeout
- python 中 random模块的用法
import random print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数 print( random.random() ) # 产生 0 到 ...
- assignment of day four
目录 1.Numeric type (1)integer (2)float Usefulness Define How to use 2.string type Use Define How to u ...
- apache+tomcat配置负载均衡,实现http与websocket接口分压
一.应用场景 在生产环境中,应用服务器(此文以tomcat为例)不免面临高访问量的压力,相比而言web服务器(此文以apache为例)能够承担更大的并发量.Apache本身带有一些模块,可以完成对应用 ...
- 2.Struts2配置文件
1.配置文件的加载顺序 0. 需要掌握 * 加载了哪些个配置文件(重点的) * 配置文件的名称是什么 * 配置文件的位置 * 配置文件的 ...
- filter的使用场景
1.filter的使用场景:假如有一个对象数组A,获取数组中的指定类型的对象放到B数组中 我们在ES5先进行for循环遍历数组,再进行if 判断,如果数组中某个对象的类型符合要求,push 到一个新数 ...
- 常用Linux日志文件功能
/var/log目录下的20个Linux日志文件功能详解 : 如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日 ...
- select 可输入的下拉框
<!DOCTYPE html> <html> <head> <title></title> <meta charset="U ...