<爬虫实战>糗事百科
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占用过高的 ...
随机推荐
- SSM框架整合思路
SSM框架整合思路 Spring在整合中起到的作用(面试时常问到) Spring管理持久层的mapper. Spring管理业务层的service,service可以调用mapper接口.Spring ...
- 剑指offer——51丑数
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. / ...
- redis 配置文件aof配置
redis 配置文件aof配置: bind 127.0.0.1 port 6379 daemonize yes dbfilename dump.rdb dir /new_renpeng/redis/ ...
- JSON 教程首页
JSON教程 JSON或JavaScript对象表示法是一个轻量级的基于文本的开放式标准,旨在为人类可读的数据交换. JSON格式最初是由Douglas Crockford规定,在RFC4627中描述 ...
- c#获取图片的高和宽
Bitmap pic = new Bitmap(图片文件名); int width = pic.Size.Width; // 图片的宽度int height = pic.Size.Height; // ...
- npm和cnpm的安装(window)
一:安装node.js 1.进入https://nodejs.org/en/中下载自己电脑相对应的node.js. 2.将下载下来的node.js进行安装. 3.利用管理员身份打开cmd,在里面输入n ...
- WSGI是什么?
WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义 ...
- html5本地存储(二)--- SQLList
html5内置了2种本地数据库,一是被称为“SQLLite”,可以通过SQL语言来访问文件型SQL数据库.二是被称为“indexedDB” 的NoSQL类型的数据库 这篇主要讲SQLLite 在js中 ...
- springboot配置swagger-rest文档
前言 swagger是一个很好的restful形式的api文档,可以通过比较小的侵入来提供很好的restful的文档.因为swagger是依赖服务生成的,所以其实是依赖服务的,这也算是它的一个小缺点吧 ...
- Install .NET Core Runtime on Linux Ubuntu 16.04 x64
原文链接https://www.microsoft.com/net/download/linux-package-manager/ubuntu16-04/runtime-current nstall ...