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. 2019 wannafly winter camp day5-8代码库

    目录 day5 5H div2 Nested Tree (树形dp) 5F div2 Kropki (状压dp) 5J div1 Special Judge (计算几何) 5I div1 Sortin ...

  2. matlab中的 ndims(a)、length(a)、size(a) 分别是什么意思?

    size(a)表示矩阵每个维度的长度比如size([1 2 3;4 5 6])等于[2 3]表示他有2行3列size([1 2 3])等于[1 3]表示他有1行3列另外size(a,n)表示矩阵a在第 ...

  3. SVN工作副本已经锁定错误的解决方法

    SVN工作副本锁定错误的解决方法 我们在使用svn版本控制软件时,时常会遇到想要更新本地项目的版本,却突然提示:工作副本已锁定.截图如下: 这种错误让人感觉很不舒服,实际上自己也没做过什么操作就这样了 ...

  4. 2019秋Java课程总结&实验总结一

    1.打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个"水仙花数". 实验源码: ...

  5. Java 并发理论简述

    一:为什么需要多线程? 线程是Java语言中不可或缺的重要部分,它们能使复杂的异步代码变得简单,简化复杂系统的开发:能充分发挥多处理器系统的强大计算能力.多线程和多进程的区别与选择可以参考我的另一篇博 ...

  6. 记一次批量修改SQLServer表数据

    前提: 1.数据有上百万条,分成10几张excel表,从数据库中导出,由业务部门修改: 2.数据没什么规律: 3.和数据库DB商量后决定先把从excel导进数据库中,再通过关联查询修改数据 将 Exc ...

  7. 48-Ubuntu-系统信息-3-查看进程命令

    序号 命令 作用 01 ps aux  process status查看进程的详细状况 02 top 动态显示运行中的进程并且排序 03 kill [-9] 进程代号 终止指定代号的进程,-9表示强行 ...

  8. kibana 7.* 设置中文 汉化

    原文:kibana 7.* 设置中文 汉化 个人博客:forever121.cn kibana 一直是 日志分析 中得力的助手 由于 kibana5.* 6.* 官方并没有支持中文,需要另外下载补丁包 ...

  9. c# 使用NOPI 操作Excel

    最近项目需要导出Excel,找来找去,微软有自己的Excel组件 using Microsoft.Office.Core;using Microsoft.Office.Interop.Excel;,但 ...

  10. Red5流媒体服务器开发

    Red5流媒体服务器开发总结 Red5 是 支持Windows,Linux等多平台的RTMP流媒体服务器,最早属于谷歌下的开源项目,先已移植到Github,地址为https://github.com/ ...