scrapy分页抓取网页(《,》第2季第16集.parse)

优采云 发布时间: 2021-10-03 19:14

  scrapy分页抓取网页(《,》第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

  参考:请求和答复

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线