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. SSM框架整合思路

    SSM框架整合思路 Spring在整合中起到的作用(面试时常问到) Spring管理持久层的mapper. Spring管理业务层的service,service可以调用mapper接口.Spring ...

  2. 剑指offer——51丑数

    题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数.   / ...

  3. redis 配置文件aof配置

    redis 配置文件aof配置: bind 127.0.0.1 port 6379 daemonize yes dbfilename dump.rdb dir /new_renpeng/redis/ ...

  4. JSON 教程首页

    JSON教程 JSON或JavaScript对象表示法是一个轻量级的基于文本的开放式标准,旨在为人类可读的数据交换. JSON格式最初是由Douglas Crockford规定,在RFC4627中描述 ...

  5. c#获取图片的高和宽

    Bitmap pic = new Bitmap(图片文件名); int width = pic.Size.Width; // 图片的宽度int height = pic.Size.Height; // ...

  6. npm和cnpm的安装(window)

    一:安装node.js 1.进入https://nodejs.org/en/中下载自己电脑相对应的node.js. 2.将下载下来的node.js进行安装. 3.利用管理员身份打开cmd,在里面输入n ...

  7. WSGI是什么?

    WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义 ...

  8. html5本地存储(二)--- SQLList

    html5内置了2种本地数据库,一是被称为“SQLLite”,可以通过SQL语言来访问文件型SQL数据库.二是被称为“indexedDB” 的NoSQL类型的数据库 这篇主要讲SQLLite 在js中 ...

  9. springboot配置swagger-rest文档

    前言 swagger是一个很好的restful形式的api文档,可以通过比较小的侵入来提供很好的restful的文档.因为swagger是依赖服务生成的,所以其实是依赖服务的,这也算是它的一个小缺点吧 ...

  10. Install .NET Core Runtime on Linux Ubuntu 16.04 x64

    原文链接https://www.microsoft.com/net/download/linux-package-manager/ubuntu16-04/runtime-current nstall ...