<爬虫实战>糗事百科
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占用过高的 ...
随机推荐
- JavaScript笔记(第一章,第二章)
JavaScript笔记(第一章,第二章) 第一章: <meta http-equiv="Content-Type" content="text/html; cha ...
- CSS:目录
ylbtech-CSS:目录 1.返回顶部 1. http://www.runoob.com/css/css-tutorial.html 2. https://www.w3school.com.cn/ ...
- jQuery 实现复选框全选、反选及获取选中的值
实现复选框全选,反选及获取选中的值: 代码如下: <!doctype html> <html lang="en"> <head> <met ...
- 设置非阻塞的套接字Socket
当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的.在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置为非阻塞模式.函数的第一个参数是套接字,第二 ...
- VC++ 2010 创建高级Ribbon界面详解(4)
5.辅助控件 除了前面我们介绍的按钮,工具栏,编辑框等基本控件外,为了支持现代软件对丰厚的界面交互方式的要求,Visual Studio 2010还提供了很多其他的辅助控件,例如我们通常会用到的“上一 ...
- CM 安装CDH 错误: 安装失败。 无法接收 Agent 发出的检测信号。
在安装CDH的时候出现错误提示: 安装失败. 无法接收 Agent 发出的检测信号. 日志提示错误: start >> raise socket.error(msg) >>er ...
- 前端跨域实现的几种方式?及使用Nginx反向代理配置。
早期为了防止CSRF(跨域请求伪造)的攻击,浏览器引入了同源策略(SOP)来提高安全性.而所谓"同源策略",即同域名(domain或ip).同端口.同协议的才能互相获取资源,而不能 ...
- Linux/CentOS 7 timezone 修改
1.su - 登录root用户 2.timedatectl set-timezone {timezone} (set后面加想要设置的时区) 举例:timedatectl set-timezone As ...
- AWS lambda DynamoDB api gateway之间的连接
创建角色 附加策略 AmazonDynamoDBFullAccess AWSLambdaDynamoDBExecutionRole 创建DynamoDB表 在表的项目中创建内容 this pipi 打 ...
- 自定义实现系统max方法
function MyMath(){ //添加了一个方法 this.getMax=function(){ //所有数字中的最大值 var max=arguments[0]; for(var i=0;i ...