本帖主要记录小菜在爬虫学习过程中常用的技巧。

1.API数据解析

scrapy爬虫一般爬取的是网页,返回的是html。但有时候需要调API,API接口返回的是json。需要对返回来的数据解析

res = json.loads(response.body_as_unicode())

2.chromeDirver查找元素

当我们爬取的页面时动态页面时,需要运行js。一般我们使用selenium来控制chromeDirver。在获取页面元素时比较麻烦,不如scrapy中的选择器那么方便。

urls = self.browser.find_elements_by_css_selector('.shop_list.shop_list_4 dd h4 a')
for url in urls:
    href = url.get_attribute('href')
    unitprice = url.find_element_by_xpath('../../../dd[2]/span[2]').text
    address = url.find_element_by_xpath('../../p[@class="add_shop"]/a').get_attribute('title')

3.scrapy状态错误码

scrapy 默认只有200状态码才会进入parse方法解析,想要指定错误码也进入parse方法,在spider中设置

handle_httpstatus_list = [404, 500]

4.item一次返回多条数据

有时一个页面有我们要的所有数据,结构需要我们整理, 数据整理后,每个it在流到pipeline中处理。

def parse(self, response):

    city = response.css("#logo-input a.city.J-city span:nth-child(2)::text").get()
    quxians = response.xpath('//div[@class="content_b"]/div[@class="box shopallCate"][2]/dl[@class="list"]')

    for item in quxians:
        quxian = item.css("dt .Bravia::text").get()
        subtanames = item.css("dd li a::text").getall()

        for sub in subtanames:
            l = WzItemLoader(item = WzSubtanameItem(), response=response)
            l.add_value('city', city)
            l.add_value('quxian', quxian)
            l.add_value('subtaname', sub)
            it = l.load_item()
            yield it

5.scrapy Get传参

params = dict(
    city = '温州',
    citylimit = True,
    keywords = brand,
    key = self.settings["GD_KEY"],
    page = 1,
    offset = self.offset
)
encodedParams = urllib.parse.urlencode(params)
yield scrapy.Request(url=self.start_urls[0] + '?' + encodedParams, meta= params, callback= self.parse_detail)

Scrapy 1.7

Scrapy 安装并创建运行爬虫项目(1) Scrapy 命令行工具(2) Scrapy 选择器(3) Scrapy Item(4) Scrapy Item Loaders(5) Scrapy Item Pipeline(6) Scrapy Feed exports(7) Scrapy 架构概览(8) Scrapy 手写一个爬虫(9) Scrapy 知乎模拟登陆 (10) Scrapy源码分析 架构概览(1) Scrapy源码分析 运行入口(2) Scrapy源码分析 核心组件初始化(3) Scrapy源码分析 核心抓取流程(4) Scrapy 常用技巧总结