设置项目
运行
scrapy startproject zipru_scraper
如下:
└── zipru_scraper
├── zipru_scraper
│ ├── __init__.py
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ └── __init__.py
└── scrapy.cfg
添加爬虫:
创建一个使用以下内容命名的文件
zipru_scraper/spiders/zipru_spider.py
import scrapy
class ZipruSpider(scrapy.Spider):
name = 'zipru'
start_urls = ['一个想爬取的链接']
拿取URL scrapy.Spider
start_requests()
start_urls
start_urls
我们添加一个方法来找到和抓取
def parse(self, response):
# proceed to other pages of the listings
for page_url in response.css('a[title ~= page]::attr(href)').extract():
page_url = response.urljoin(page_url)
yield scrapy.Request(url=page_url, callback=self.parse)
我们会发现到其它页面的所有链接,回到响应对象
start_urlsparse(response)parse(response)parse(response)
我们对一个页面的爬取一般都会有【标题,URL,大小,内容,评论】。
def parse(self, response):
# proceed to other pages of the listings
for page_url in response.xpath('//a[contains(@title, "page ")]/@href').extract():
page_url = response.urljoin(page_url)
yield scrapy.Request(url=page_url, callback=self.parse)
# extract the torrent items
for tr in response.css('table.lista2t tr.lista2'):
tds = tr.css('td')
link = tds[1].css('a')[0]
yield {
'title' : link.css('::attr(title)').extract_first(),
'url' : response.urljoin(link.css('::attr(href)').extract_first()),
'date' : tds[2].css('::text').extract_first(),
'size' : tds[3].css('::text').extract_first(),
'seeders': int(tds[4].css('::text').extract_first()),
'leechers': int(tds[5].css('::text').extract_first()),
'uploader': tds[7].css('::text').extract_first(),
}
我们这个方法生产字典,并且类型自动与请求区分开来。一般包含在parse(response)
现在就可以:scrapy crawl zipru -o torrents.jl
之后我们就可以看见了一个JSON的文件格式
最后给出一个问题:
简单的问题
我们的第一个请求得到一个被忽略的响应,然后一切都关闭了,因为我们只用一个 URL 播种了爬网。 即使在没有会话历史记录的隐身模式下,相同的请求在 Web 浏览器中也能正常工作,因此这必须是由请求标头中的某些差异引起的。 我们可以使用 tcpdump 来比较两个请求的标头,但这里有一个常见的罪魁祸首,我们应该首先检查:用户代理。403
在下一篇的时候给与解答