上次也爬过吾爱破解,不过是单纯的模块的使用。
今天再次爬取吾爱破解python模块,使用scrapy下的spider、crwalspider类。
当然,为了不给网站造成影响, 只爬取3页内容!
一、爬取内容:
二、 结果展示
三、主要文档
(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)
|