<爬虫实战>糗事百科
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占用过高的 ...
随机推荐
- 剑指offer——60二叉树的深度
题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 题解: 简单的深度遍历即可. class Solution ...
- testNG官方文档翻译-3 testng.xml
你可以通过以下几种不同的方法触发TestNG: 用一个testng.xml文件 使用ant 从命令行触发 这个章节将会介绍testng.xml的格式(你也可以在下面找到关于ant和命令行的内容). 关 ...
- testNG官方文档翻译-1 简介
官方文档链接http://testng.org/doc/documentation-main.html 简介 TestNG是一个被设计用来简化广泛的测试需求的测试框架,它既可应用于单元测试(测试一个独 ...
- 深入理解JAVA虚拟机原理之垃圾回收器机制(一)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 对于程序计数器.虚拟机栈.本地方法栈这三个部分而言,其生命周期与相关线程有关,随 ...
- <思维导图>思维导图
- HTML常见问题
一.外边距,margin: 垂直外边距的重叠:在网页中相邻的垂直方向的外边距会发生外边距的重叠 所谓的外边距重叠指兄弟元素之间的相邻外边距会取最大值而不是取和. .box1{margin-bottom ...
- netstat -pa --unix >>test.txt
netstat -pa --unix >>test.txt 输出套接字 命名socket信息
- 笔记53 Mybatis快速入门(四)
动态SQL 1.if 假设需要对Product执行两条sql语句,一个是查询所有,一个是根据名称模糊查询.那么按照现在的方式,必须提供两条sql语句:listProduct和listProductBy ...
- python中while与else的联姻
循环使用 else 语句在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断 ...
- java两个栈实现一个队列&&两个队列实现一个栈
栈:先进后出 队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...