试着使用scrapy爬一个书本信息网站,存到本地csv文件(也可以json)。
安装scrapy:
python3 -m pip install scrapy
本质其实就是定义自己的spider及其行为, 需要从scrapy里的Spider类继承下来。新建webscraping-srapy.py如下
import scrapy
url = "http://books.toscrape.com/"
class BookSpider(scrapy.Spider):
name = "bookspider"
# def start_requests(self):
# urls = ['http://xx','http://xx']
# for url in urls:
# yield scrapy.Request(url=url, callback=self.parse)
# 其实不需要override 此函数而是直接定义start_requests()会默认使用的start_urls list
start_urls = [url]
def parse(self, response):
for article in response.css("article.product_pod"):
yield {
"price": article.css(".price_color::text").extract_first(), # or use .get() but getall() will return a list
"title": article.css("h3 > a::attr(title)").extract_first()
}
import pdb; pdb.set_trace() # 调试
#next = response.css(".next > a::attr(href)").extract_first()
#selector可以直接传入, 而且不需要写attr(href) 因为对于<a> element默认解析attr的值
next = response.css(".next > a")[0]
if next:
#笨办法是生成完整路径再继续yield Request
#next_page = response.urljoin(next_page)
#yield scrapy.Request(next_page, callback=self.parse)
yield response.follow(next, self.parse)
假设我本地存下来到books.csv, 命令行是
scrapy runspider -o books.csv webscraping-srapy.py --pdb
最后说下,可以自己用scrapy shell 去做一些scraping, extract信息出来验证下,个人比后面用pdb效率高些:
scrapy shell 'http://books.toscrape.com/'