爬虫-Scrapy框架安装使用2

发布时间 2023-07-01 17:08:01作者: 水开白

Scrapy 框架其他方法功能集合笔记

使用LinkExtractor提取链接

  • 使用Selector

    import scrapy
    
    from bs4 import BeautifulSoup
    
    class BookSpider(scrapy.Spider):
        name = "book"
        allowed_domains = ["books.toscrape.com"]
        start_urls = ["http://books.toscrape.com/"]
    
        def parse(self, response):
            soup = BeautifulSoup(response.text,'lxml')
            urls = soup.find_all(class_="col-xs-6 col-sm-4 col-md-3 col-lg-3")
            for i in urls:
                ### 提取链接,得到没有域名的路径,如图一所示
                url = i.find(class_="image_container").a.attrs.get('href')
                print(url)
                ### 使用response.urljoin方法计算出绝对url地址,如图二所示
                URL = response.urljoin(url)
                print(URL)
    

  • 使用LinkExtractor

 import scrapy
 from scrapy.linkextractors import LinkExtractor

 from bs4 import BeautifulSoup

 class BookSpider(scrapy.Spider):
     name = "book"
     allowed_domains = ["books.toscrape.com"]
     start_urls = ["http://books.toscrape.com/"]

     def parse(self, response):
         soup = BeautifulSoup(response.text,'lxml')
         urls = soup.find_all(class_="col-xs-6 col-sm-4 col-md-3 col-lg-3")
         for i in urls:
             ### 提取链接
             url = i.find(class_="image_container").a.attrs.get('href')
             ### 创建一个LinkExtractor对象,使用一个或多个构造器参数描述提取规则
             ### 如图一所示
             links = LinkExtractor(url)
             ### 调用LinkExtractor对象的extract_links方法传入一个Response对象,该方法依据创建对象时所描述的提取规则,
             ### 在Response对象所包含的页面中提取链接,最终返回一个列表,其中的每一个元素都是一个Link对象,即提取到的一个链接
             ### 如图二所示
             Link = links.extract_links(response)
             ### 得到最终链接
             ### 如图三所示
             print(Link)



使用Exporter导出数据

1、 在Scrapy中,负责导出数据的组件被称为Exporter(导出器
2、 Scrapy内部实现了多个Exporter,每个Exporter实现一种数据格式的导出
3、 parse方法需要返回列表套字典

  • 使用命令行参数指定
import scrapy

from bs4 import BeautifulSoup

class BookSpider(scrapy.Spider):
    name = "book"
    allowed_domains = ["books.toscrape.com"]
    start_urls = ["http://books.toscrape.com/"]

    def parse(self, response):
        booklist=[]
        soup = BeautifulSoup(response.text,'lxml')
        book_list = soup.find_all(class_="col-xs-6 col-sm-4 col-md-3 col-lg-3")
        for book in book_list:
            name = book.article.h3.a['title']
            price = book.find(class_="price_color").text
            booklist.append({'书名':name,'价格':price})
        ### 返回列表套字典
        return booklist

1、 -o 指定导出路径
2、 -t 指定导出文件类型,一般可以不写,scrapy爬虫可以通过文件后缀判断导出类型

### 终端执行命令如下:
scrapy crawl book -o b.csv

结果如下: