按照前面几篇文章的做法,创建scrapy工程,进入到spiders文件夹中创建爬虫,然后修改settings.py文件,让它不遵从robots协议并更换UA,指定日志等级为error:

USER_AGENT = 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)'
ROBOTSTXT_OBEY = False
LOG_LEVEL='ERROR' 

爬虫文件还是跟前面的一样,不过这里需要进行数据解析:

# -*- coding: utf-8 -*-
import scrapy
class MeiziSpider(scrapy.Spider):
    name = 'meizi'
    allowed_domains = ['www.linuxcool.com']
    start_urls = ['https://www.linuxcool.com/']
    def parse(self, response):
        # 数据解析: 某网站中文章标题、url
        # response.xpath()
        # tree.xpath()
        # 上述两个xpath不是同一个方法,但是使用上基本相同,只有细微差别
        ul_list=response.xpath('//ul[@class="category-posts"]/li')
        for li in ul_list:
            href=li.xpath('./a/@href')
            title=li.xpath('./a/text()')
            print(href,title)

我们借助etree中的xpath语法进行数据提取,运行爬虫你会发现,输出的不是字符串,而是一个Selector对象,且提取的字符串数据被存储在了该对象的data中去,这里需要通过extract方法来提取字符串数据:

# -*- coding: utf-8 -*-
import scrapy
class MeiziSpider(scrapy.Spider):
    name = 'meizi'
    allowed_domains = ['www.linuxcool.com']
    start_urls = ['https://www.linuxcool.com/']
    def parse(self, response):
        ul_list=response.xpath('//ul[@class="category-posts"]/li')
        for li in ul_list:
            # extract() 将列表中的每一个列表元素表示的Selector对象中的字符串取出
            href=li.xpath('./a/@href').extract()
            # extract()表示将列表中的第0个列表元素进行数据提取
            title=li.xpath('./a/text()').extract_first()
            print(href,title)

这里需要注意extract()和extract_first()的区别,当提取的数据存在多个的时候可以使用extract(),当提取的数据只有一个的时候可以使用extract_first(),需要你自己取判别。

发表评论

后才能评论