如果只是上次那么简单,就不用scrapy这么复杂的框架了,直接request就好了,scrapy更适合抓取一页是主页面(目录),根据目录里的连接抓取跳转之后的页面内容。比如在什么值得买中,这就是目录。
这是其中一个子选项的跳转页面。
主要思路是,先找到目录中各个子页面的href,然后写一个def来抓取每个子页面的需要信息。还是先上代码。
import scrapy
from pyquery import PyQuery as pq
class SmzdmCrawler(scrapy.Spider):
name = 'smzdm'
start_urls = ['https://faxian.smzdm.com/']
def parse(self, response):
res = pq(response.body)
for item in res('.feed-block-ver').items():
yield scrapy.Request(item('a').attr('href'),self.parse_detail)
def parse_detail(self,response):
res = pq(response.body)
print(res('.article_title').text())
其中比较重要的是 这句
yield scrapy.Request(item('a').attr('href'),self.parse_detail)
yield跟return比较像,但是return是结束一个def,yield是一个生成器,每次循环迭代一个内容出来。
具体的理解yield
同时,return会结束函数,但是yield不会,所以一个def里可以有多个yield,比如yield item再yield Request再yield 另一个Request都可以。
还有一个小tips,对于每一级的 爬取都返回了item的情况,比如在索引页面也有item要抓取,在具体页面要抓取的情况,要用meta={'item':item}来传递数据。
不同级别的数据抓取集合
yield就每次生成一个请求,返回一个response,scrapy.Request第一个参数是子网页的网址,第二个参数是解析子网页的函数名称,只是名称不是调用,所以不用加()。
def parse_detail()
就按照常规的方法进行解析就好了。