一篇文章,采集四个网站,它们是阳光理政,图虫网,书伴网,半次元网

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 应该是权限认证。

再次测试发现最后一个参数去除之后,也可获取数据,这样就简单多了。

通过判断接口数据判断是否需要切换日期,当无数据时下述 JSONtop_list_item_info 返回空,此时即可切换时间。

{
  "code": 0,
  "msg": "",
  "data": {
    "top_list_item_info": []
  }
}

今日复盘结论

今日复盘中发现当年由于写作经验不足,存在部分小知识点遗漏的情况,这些遗漏的细节统一编写到新版本的 《Python 爬虫 120 例》中进行逐步完善。

良心博主,竟然 3 年不掉线。

收藏时间

做个不可能实现的任务吧,收藏过 400,橡皮擦将回复评论区所有人,发一个神秘码

今天是持续写作的第 191 / 200 天。
可以关注我,点赞我、评论我、收藏我啦。

更多精彩

以上是关于一篇文章,采集四个网站,它们是阳光理政,图虫网,书伴网,半次元网的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫入门教程 10-100 图虫网多线程爬取

Python爬虫入门教程 9-100 河北阳光理政投诉板块

python3爬虫-通过requests爬取图虫网

Aurora 论坛图片下载

基于 Python 的 Scrapy 爬虫入门:页面提取

欢迎来访个人网站——阳光日志