吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3641|回复: 16
收起左侧

[Python 转载] 再次爬取吾爱破解-scrapy的spider、crwalspider的使用

[复制链接]
山野村夫-陈墨 发表于 2020-3-25 23:20
上次也爬过吾爱破解,不过是单纯的模块的使用。
今天再次爬取吾爱破解python模块,使用scrapy下的spider、crwalspider类。

当然,为了不给网站造成影响, 只爬取3页内容!

一、爬取内容:
8VG{1R}CF96CR$MSP[K6Z7U.png

二、 结果展示

E`0R@S19DH}VJ45`9M)6@.png

三、主要文档
(1)crwalspider类,翻页存在问题
[Python] 纯文本查看 复制代码
"""
   爬虫内容 , 爬取吾爱破解的python模块, 与“wuaipojie_no_scrapyspider.py”爬取内容一样。
   只不过,方式不同。

   这个文件采取 规则爬虫的方式--通过对url的提取执行函数

   采用crwalspder类

   指令:crapy genspider -t crwal name domain

"""
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from myfirst_scrapy.items  import    wuaipojie_item as  item_struct


class WuaipojieScrapyspiderSpider(CrawlSpider):
    name = 'wuaipojie_scrapyspider'
    allowed_domains = ['52pojie.cn']
    start_urls = ['https://www.52pojie.cn/forum.php?mod=forumdisplay&fid=24&filter=typeid&typeid=29&page=1']
    # 第2页 :forum.php?mod=forumdisplay&fid=24&typeid=29&filter=typeid&typeid=29&page=2
    # 第3页 :forum.php?mod=forumdisplay&fid=24&typeid=29&filter=typeid&typeid=29&page=3
    #  推断第一页:forum.php?mod=forumdisplay&fid=24&typeid=29&filter=typeid&typeid=29&page=1

    # 连接提取: 这个很关键。 如果url 在网页中的获取是程序自己完成的
    rules = (
        Rule(LinkExtractor(allow=r'page=\d+$'),
             callback='parse_item',
             follow=True  ),
        Rule( LinkExtractor(allow=r"https://www.52pojie.cn/forum.php?mod=forumdisplay&fid=24&filter=typeid&typeid=29&page=\d+"),
              follow=True)

    )
    page_index = 0

    def parse_item(self, response):
        WuaipojieScrapyspiderSpider.page_index += 1
        # 输出page_index
        print("\n\ncrwalspider类第 {} 页".format( str( WuaipojieScrapyspiderSpider.page_index  )))
        # 爬取本页的信息
        item_dict =  item_struct()
        info_list = response.xpath("//*[@id='threadlisttableid']//tbody")
        for  item in  info_list:
             item_dict["title"] = item.xpath("./tr/th/a[2]/text()").extract_first()
             item_dict["anthor"] = item.xpath("./tr/td[2]/cite/a/text()").extract_first()
             item_dict["publishing_time"] = item.xpath("./tr/td[2]/em/span/text()").extract_first()
             item_dict["number_of_read"] = item.xpath("./tr/td[3]/a/text()").extract_first()
             item_dict["number_of_comment"] = item.xpath("./tr/td[3]/em/text()").extract_first()
             if not item_dict["title"] == None:
                yield  item_dict

        # 到第三页自己结束吧


(2)spider类
[Python] 纯文本查看 复制代码
"""
   爬虫内容 , 爬取吾爱破解的python模块, 与“wuaipojie_scrapyspider.py”爬取内容一样。
   只不过,方式不同。

   这个文件采取 url列表的爬取方式, spider类的派生

   1、scrapy  genspider name   domain  新建spider爬虫文件
   2、获取当前url的数据
   3、获取下一页的url, 并且回调parse函数,继续爬
   yield  scrapy.Request(url,  callback,  font_filter )

"""
# -*- coding: utf-8 -*-
import scrapy
from   myfirst_scrapy.items import wuaipojie_item as  item_struct

class WuaipojieNoScrapyspiderSpider(scrapy.Spider):
    name = 'wuaipojie_no_scrapyspider'
    allowed_domains = ['52pojie.cn']
    start_urls = ['https://www.52pojie.cn/forum.php?mod=forumdisplay&fid=24&filter=typeid&typeid=29']

    #  标记 页数
    page_index = 0
    def parse(self, response):

        WuaipojieNoScrapyspiderSpider.page_index += 1
        # 输出page_index
        print("\n\n派生类第 {} 页".format( str( WuaipojieNoScrapyspiderSpider.page_index  )))
        # 爬取本页的信息
        item_dict =  item_struct()
        info_list = response.xpath("//*[@id='threadlisttableid']//tbody")
        for  item in  info_list:
             item_dict["title"] = item.xpath("./tr/th/a[2]/text()").extract_first()
             item_dict["anthor"] = item.xpath("./tr/td[2]/cite/a/text()").extract_first()
             item_dict["publishing_time"] = item.xpath("./tr/td[2]/em/span/text()").extract_first()
             item_dict["number_of_read"] = item.xpath("./tr/td[3]/a/text()").extract_first()
             item_dict["number_of_comment"] = item.xpath("./tr/td[3]/em/text()").extract_first()
             if not item_dict["title"] == None:
                yield  item_dict


        # 爬取下一页
        # 获取下一页的url:
        next_url = "https://www.52pojie.cn/" +response.xpath("//*[@id='autopbn']/@rel").extract_first()

        #  爬取3页就行了, 做个好人吧
        if  WuaipojieNoScrapyspiderSpider.page_index ==3:
            return
        print( next_url )
        yield   scrapy.Request(
            url=next_url,
            callback=self.parse,
            dont_filter=False
        )


四、一点反思:
(1)crwalspider的按页结束和翻页存在问题,暂时没有办法解决;
(2)大约10次左右会被反爬。
完整程序附上:
myfirst_scrapy.rar (11.86 KB, 下载次数: 6)

免费评分

参与人数 2吾爱币 +2 收起 理由
banhave + 1 我很赞同!
绫织梦 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zhangxu888 发表于 2020-3-26 00:24
这虫都爬家里来了
涛之雨 发表于 2020-3-26 00:03
可以用ua库随机获取ua
推荐一下https://fake-useragent.herokuapp.com/browsers/0.1.11
我是直接把所有的ua都写到一个列表里,然后用random.choice随机抽取
[Python] 纯文本查看 复制代码
def get_ua():
    #数据来自:
    #[url]https://fake-useragent.herokuapp.com/browsers/0.1.11[/url]
    ua_ALL='["Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36"]'
#此处省略巨多ua(s)
    UAs  = json.loads(ua_ALL)
    #hea是我们自己构造的一个字典,里面保存了user-agent。
    #让目标网站误以为本程序是浏览器,并非爬虫。
    #从网站的Requests Header中获取。
    hea = {'User-Agent':random.choice(UAs)}
    return hea
wenwlg 发表于 2020-3-26 00:03
User-agent: AhrefsBot
Disallow: /

User-agent: *
Disallow: /api/
Disallow: /data/
Disallow: /source/
Disallow: /install/
Disallow: /template/
Disallow: /config/
Disallow: /uc_client/
Disallow: /uc_server/
Disallow: /static/
Disallow: /admin.php
Disallow: /search.php
Disallow: /member.php
Disallow: /member.php?mod=logging*
Disallow: /api.php
Disallow: /misc.php
Disallow: /connect.php
Disallow: /forum.php?mod=redirect*
Disallow: /forum.php?mod=post*
Disallow: /home.php?*
Disallow: /userapp.php?mod=app&*
Disallow: /*?mod=misc*
Disallow: /*?mod=attachment*
Disallow: /*mobile=yes*
Disallow: /space-*
Disallow: /forum.php?fid=*
Disallow: /forum.php?goto=*
Disallow: /forum.php?tid=*
Disallow: /forum.php?op=*
Disallow: /forum.php?do=*
Disallow: /*?peed=noscript
Disallow: /*?ModPagespeed=noscript
Disallow: /?*
Disallow: /index.php?*
Disallow: /*?_t_t_t=*
看,六眼飞鱼 发表于 2020-3-26 00:58
是个狠人
 楼主| 山野村夫-陈墨 发表于 2020-3-26 01:45
wenwlg 发表于 2020-3-26 00:03
User-agent: AhrefsBot
Disallow: /

robots只是道德层面的约束,并没有法律效力。再者我爬取的数据也没有用到商业用途。
首先,不违法。
我只是爬取少量数据,不会对网站服务器造成影响,而且也是单纯用作一次练习,
其次,不违背道德。
 楼主| 山野村夫-陈墨 发表于 2020-3-26 01:47
zhangxu888 发表于 2020-3-26 00:24
这虫都爬家里来了

单纯的练习, 没有恶意
江河宁夏 发表于 2020-3-26 04:35
给.你点个赞
lemonback 发表于 2020-3-26 07:32
这。。。。太强了
vagrantear 发表于 2020-3-26 08:38
我还以为会被管理删帖hhh
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 03:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表