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
结果如下: