一篇文章,采集四个网站,它们是阳光理政,图虫网,书伴网,半次元网
Posted 梦想橡皮擦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章,采集四个网站,它们是阳光理政,图虫网,书伴网,半次元网相关的知识,希望对你有一定的参考价值。
爬虫 100 例专栏复盘系列第 3 篇文章
案例 9:河北阳光理政投诉板块数据采集
很遗憾,该网址不可访问了,本案例增加的新模块是 lxml
,也就是基于该模块的学习。
既然不能访问了,那我们切换到实话实说频道,http://yglz.tousu.hebnews.cn/shss-1.html。
在原案例中,最终获取到的数据存储到了 mongodb
中,复盘案例以抓取到数据为准,存储部分参考原案例即可。
import requests
import random
from lxml import etree # 从lxml中导入etree
ua = ['Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36']
headers = {
'user-agent':ua[random.randint(0,2)]
}
# 测试循环10页即可
for i in range(1,10):
response = requests.get(f"http://yglz.tousu.hebnews.cn/shss-{i}.html",headers=headers)
html = response.content.decode("utf-8")
print("*"*200)
tree = etree.HTML(html) # 解析html
divs = tree.xpath('//div[@class="listcon"]') # 解析列表区域div
for div in divs: # 循环这个区域
try:
# 注意下面是通过div去进行的xpath查找,同时加上try方式报错
shouli = div.xpath('span[1]/p/a/text()')[0] # 受理单位
content = div.xpath('span[2]/p/a/text()')[0] # 投诉内容
datetime = div.xpath('span[3]/p/text()')[0].replace("\\n","") # 时间
status = div.xpath('span[5]/p/text()')[0].replace("\\n","") # 时间
one_data = {"shouli":shouli,
"type":type,
"content":content,
"datetime":datetime,
"status":status,
}
print(one_data) # 打印数据,方便存储到mongodb里面
except Exception as e:
print("内部数据报错")
print(div)
continue
目标网站从异步请求,更换到了现在的同步数据加载,同时去除了原先的反爬限制,网站加载速度明显变快,真棒。
案例 10:图虫网爬虫
该案例主要用到的是 Queue
,原博客中涉及的一些全局变量缺失,以及写错一个变量名,本次复盘都进行了更新。
原案例地址:https://dream.blog.csdn.net/article/details/83017079
复盘后源码地址:https://codechina.csdn.net/hihell/scrapy 案例 10
案例 11:周读网修改为书伴网爬虫
该类网站以采集和分享电子书为主,经常涉及侵权问题,目前网站作者已转移到公众号,并开始对外收费,本案例也随之失效。
重启该案例非常简单,只需选择任意网络电子书平台即可,例如书伴网:http://www.shuban.net/list-19-1.html
该案例涉及了 asynio
模块与 aiohttp
模块的应用,复盘过程中发现介绍并不详细,这部分细节知识点在《爬虫 120 例》中进行系统补充,本次复盘,优先将案例调整可用。
核心代码如下,阅读代码时重点关注任务盒子 tasks
部分内容,数据解析部分未补充完整,属于基础的 lxml
提取。
import requests
from lxml import etree
# 导入协程模块
import asyncio
import aiohttp
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
"Host": "www.shuban.net",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"}
async def get_content(url):
print("正在操作:{}".format(url))
# 创建一个session 去获取数据
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers) as res:
if res.status == 200:
source = await res.text() # 等待获取文本
tree = etree.HTML(source)
await async_content(tree)
async def async_content(tree):
title = tree.xpath("//h1[@class='title']/a/text()")[0]
print(title)
# 如果页面没有信息,直接返回即可
# if title == '':
# return
# else:
# try:
# description = tree.xpath("//div[@class='hanghang-shu-content-font']")
# author = description[0].xpath("p[1]/text()")[0].replace("作者:","") if description[0].xpath("p[1]/text()")[0] is not None else None
# cate = description[0].xpath("p[2]/text()")[0].replace("分类:","") if description[0].xpath("p[2]/text()")[0] is not None else None
# douban = description[0].xpath("p[3]/text()")[0].replace("豆瓣评分:","") if description[0].xpath("p[3]/text()")[0] is not None else None
# # 这部分内容不明确,不做记录
# #des = description[0].xpath("p[5]/text()")[0] if description[0].xpath("p[5]/text()")[0] is not None else None
# download = tree.xpath("//a[@class='downloads']")
# except Exception as e:
# print(title)
# return
# ls = [
# title,author,cate,douban,download[0].get('href')
# ]
# return ls
if __name__ == '__main__':
url_format = "https://www.shuban.net/read-{}.html"
full_urllist = [url_format.format(i) for i in range(
50773, 50783)] # 控制到第3页,更多数据自行获取
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(get_content(url)) for url in full_urllist]
results = loop.run_until_complete(asyncio.wait(tasks))
复盘后源码地址:https://codechina.csdn.net/hihell/scrapy 案例 11
案例 12:半次元网站 COS 爬虫
首先对目标网站进行测试,发现可以打开,放心了,至少它还在。
然后分析数据请求接口,发现已经发生了变更,具体如下:
https://bcy.net/apiv3/rank/list/itemInfo?p=1&ttype=cos&sub_type=week&date=20210726&_signature=Rt2KvAAA*****bdiqAACYm
https://bcy.net/apiv3/rank/list/itemInfo?p=2&ttype=cos&sub_type=week&date=20210726&_signature=Rt2KvAAA*****bdiqAACYm
https://bcy.net/apiv3/rank/list/itemInfo?p=3&ttype=cos&sub_type=week&date=20210726&_signature=Rt2KvAAA*****bdiqAACYm
注意上述地址,有三个核心的参数 p
即页码,date
是日期,_signature
应该是权限认证。
再次测试发现最后一个参数去除之后,也可获取数据,这样就简单多了。
通过判断接口数据判断是否需要切换日期,当无数据时下述 JSON
的 top_list_item_info
返回空,此时即可切换时间。
{
"code": 0,
"msg": "",
"data": {
"top_list_item_info": []
}
}
今日复盘结论
今日复盘中发现当年由于写作经验不足,存在部分小知识点遗漏的情况,这些遗漏的细节统一编写到新版本的 《Python 爬虫 120 例》中进行逐步完善。
良心博主,竟然 3 年不掉线。
收藏时间
做个不可能实现的任务吧,收藏过 400,橡皮擦将回复评论区所有人,发一个神秘码
今天是持续写作的第 191 / 200 天。
可以关注我,点赞我、评论我、收藏我啦。
更多精彩
以上是关于一篇文章,采集四个网站,它们是阳光理政,图虫网,书伴网,半次元网的主要内容,如果未能解决你的问题,请参考以下文章