基于Spider的全站数据爬取

踩坑

一开始运行的时候会出来很多其他的日志信息,这里我忘了设置settings.py中LOG_LEVEL='ERROR'

获取xpath


这里获取xpath比较简单。
首先发现所有的照片+文字都是在li标签下的,所以第一步是获取所有的li标签,得到li标签的列表。

li_list = response.xpath("/html/body/div[3]/ul/li")

然后再从li标签当前的xpath下获取对应文字的照片。这里一定一定要注意从当前li标签向下找时,必须要加dot!!!

 for li in li_list:
      img_name = li.xpath("./a[2]/text()").extract()    # xpath得到是是一个selector对象。
      # 对列表调用extract后,将列表的每一个Selector对象中的data对应的字符串提取了出来

如何获取多页数据?

点击不同页数观察其url,发现如下特点:

page2 => https://www.tuiimg.com/meinv/list_2.html
page3 => https://www.tuiimg.com/meinv/list_3.html
page7 => https://www.tuiimg.com/meinv/list_7.html

所以得到所有的页面url
这里通过自行手动发送请求发送

使用format格式模拟当前页的url,然后对该url发起请求

# 用于构造一个请求对象,以便在Scrapy爬虫中发送给指定的URL,并在请求返回后调用指定的回调函数
yield scrapy.Request(url=new_url, callback=self.parse)

meinv.py

import scrapy


class MeinvSpider(scrapy.Spider):
    name = "meinv"
    # allowed_domains = ["www.tuiimg.com"]
    start_urls = ["http://www.tuiimg.com/meinv/"]

    # 生成一个通用的url模板,用于后面修改
    url = 'https://www.tuiimg.com/meinv/list_%d.html'
    page_num = 2
    def parse(self, response):
        # 页面数据有很多页,获取多页的数据
        li_list = response.xpath("/html/body/div[3]/ul/li")
        print("page:", self.page_num)
        for li in li_list:
            img_name = li.xpath("./a[2]/text()").extract()    # xpath得到是是一个selector对象。使用extract得到文字。
            print(img_name)

        # 获取前10页的数据
        if self.page_num <= 10:
            new_url = format(self.url%self.page_num)    # 拼在一起
            self.page_num += 1
            # 手动发送请求:callback()回调函数专门用于数据处理。
            # 用于构造一个请求对象,以便在Scrapy爬虫中发送给指定的URL,并在请求返回后调用指定的回调函数
            yield scrapy.Request(url=new_url, callback=self.parse)


你可能感兴趣的:(爬虫学习,windows)