scrapy分页抓取网页(《,》第2季第16集.parse)
优采云 发布时间: 2021-10-03 19:14scrapy分页抓取网页(《,》第2季第16集.parse)
为了获得PV,许多网站会将一个完整的文章划分为多个页面,这也会给爬虫程序带来一些小问题
分页文章
传统的方法是解析第一页的数据,将其保存到item,然后检测下一页是否存在。如果是这样,重复抓取功能直到它在最后一页停止
但是,扫描中存在一个问题。扫描中的回调函数无法返回值,并且无法返回捕获的文章正文。因此,可以使用request的meta属性在一个方向上将item变量传递给crawl函数
def parse_article(self, response):
"""parse article content
Arguments:
response {[type]} -- [description]
"""
selector = Selector(response)
article = ArticleItem()
# 先获取第一页的文章正文
article['content'] = selector.xpath(
'//article[@class="article-content"]').get()
# 拆分最后一页的 url, 可以得到文章的base url 和总页数
page_end_url = selector.xpath(
'//div[@class="pagination"]/ul/li/a/@href').extract()[-1]
page_base_url, page_count = re.findall(
'(.*?)_(.*?).html', page_end_url)[0]
page_count = int(page_count)
for page in range(2, page_count + 1):
# 构造出分页 url
url = page_base_url + '_{}.html'.format(page)
# 手动生成 Request 请求, 注意函数中的 priority 参数, 代表了 Request 是按顺序执行的, 值越大, 优先级越高
request = Request(url=url, callback=self.parse_content, priority=-page)
# 向 self.parse_content 函数传递 item 变量
request.meta['article'] = article
yield request
self.parse_uu内容主要用于抓取文章文本并将其存储在项目中
def parse_content(self, response):
selector = Selector(response)
article = response.meta['article']
# 注意这里对 article['content']的操作是 +=, 这样不会清空上一页保存的数据
article['content'] += selector.xpath('//article[@class="article-content"]').get()
yield article
参考:请求和答复