看各种爬虫文献也有好几天了,总是感觉下不了手,总结一句“提笔忘字,总是因为看的太多而写的太少”。所以从现在开始,把看到的想到的,需要总结的东西慢慢的都沉淀下来,扎扎实实的走好每一步。
先来说这几天遇到的各种坑,好不容易找到了关于pyquery和pyspider的各种资料,准备敲到电脑上试试,结果出现了好几个问题。电脑上安装的是python3,代码是python2,转换好了环境,发现目标网站的格式变得,各种苦恼,各种困惑。或许这也是很多学习写爬虫的人总会遇到的问题。从网上下载了几本书,对照着写,结果发现各种库的调用格式都变了,真的是各种坑,各种坑,坑。。。。。
先来看pyspider的官方docs中的第一个例子
1 from pyspider.libs.base_handler import * 2 3 4 class Handler(BaseHandler): 5 crawl_config = { 6 } 7 8 @every(minutes=24 * 60) 9 def on_start(self): 10 self.crawl(‘http://scrapy.org/‘, callback=self.index_page) #很逗比的pyspider的案例居然爬去另一位大神之作scrapy的网站,这一行可以看作是初始化,从callback函数中可以看出调用index_page 11 12 @config(age=10 * 24 * 60 * 60) 13 def index_page(self, response): 14 for each in response.doc(‘a[href^="http"]‘).items(): # 用pyquery解析获取初始链接中的每一个超级链接,对每一个链接再调用detail_page,需要注意的是如果需要翻页的话,在翻页的链接上再调用index_page 15 self.crawl(each.attr.href, callback=self.detail_page) 16 17 @config(priority=2) 18 def detail_page(self, response): #在detail_page页面中获取 url和title,并返回 19 return { 20 "url": response.url, 21 "title": response.doc(‘title‘).text(), 22 }
def on_start(self)
是爬虫的入口,当点击run时显示的第一个页面self.crawl(url, callback=self.index_page)
* 是程序最重要的接口。它添加了一个新的爬去任务。需要注意的是self.crawl
中有很多参数可以自己设置。def index_page(self, response)返回一个
Response
* 对象.response.doc
* 是 pyquery 对象,这个对象就像 jQuery的 API 一样获取元素。def detail_page(self, response)返回字典
对象. 这个结果默认由resultdb
获取. 可以通过改写on_result(self, result)方法处理存储方式。
@every(minutes=24*60, seconds=0)
* 24小时乘以60分整天运行@config(age=10 * 24 * 60 * 60)
* 运行10天age=10 * 24 * 60 * 60
* tell scheduler discard the request if it have been crawled in 10 days. pyspider will not crawl a same URL twice by default (discard forever), even you had modified the code, it‘s very common for beginners that runs the project the first time and modified it and run it the second time, it will not crawl again (readitag
for solution)@config(priority=2)
* detail pages 优先运行
官方docs中爬取 http://www.imdb.com的爬虫也因为IMDB的改版已经不能使用,顺手调试了一下代码
#!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2015-01-04 03:08:55 # Project: tutorial_imdb from pyspider.libs.base_handler import * class Handler(BaseHandler): """ It‘s a sample scrape script of pyspider tutorial: Level 1: HTML and CSS Selector http://docs.pyspider.org/en/latest/tutorial/HTML-and-CSS-Selector/ """ @every(minutes=24 * 60) def on_start(self): self.crawl(‘http://www.imdb.com/search/title?count=100&title_type=feature,tv_series,tv_movie&ref_=nv_ch_mm_1‘, callback=self.index_page) @config(age=24 * 60 * 60) def index_page(self, response): for each in response.doc(‘a[href^="http"]‘).items(): for each in response.doc(‘h3.lister-item-header a‘).items(): 把官方文档中的正则表达式改成了css path,这样看起来容易理解多了 self.crawl(each.attr.href, priority=9, callback=self.detail_page) self.crawl([x.attr.href for x in response.doc(‘.next-page‘).items()], callback=self.index_page) def detail_page(self, response): return { "url": response.url, "title": response.doc(‘div.title_wrapper h1‘).text(), "rating": response.doc(‘div.ratingValue strong span‘).text(), "stars": [x.text() for x in response.doc(‘div.credit_summary_item span a span.itemprop‘).items()], }
进一步分析IMDB网站就会发现,影片详细信息页面下面的很多是不能够用csspath抓取的,需要进一步解析,明天再来(*^_^*)
时间: 2024-10-11 07:08:18