pyspider爬虫的一个应用

1.为了能够将爬取到的数据存入本地数据库,现在本地创建一个mysql数据库example,然后 在数据库中建立一张表格test,示例如下:

;( AUTO_INCREMENT, , `direct` varchar(30), `performer` date, `type` varchar(30), , `language` varchar(30), `date` varchar(30), `time` varchar(30), , `score` varchar(30), `comments` varchar(300), `scenario` varchar(300), `IMDb` varchar(30), PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;

2.如果使用开源框架pyspider来进行爬虫的话,默认情况下,会把爬取到的结果存放到result.db这个sqilite数据库中,但是为了方便操作,我们将结果存放到mysql中。接下 来要做的一个操作就是重写on_result方法,实例化调用我们自己实现的SQL方法,具体 实例如下:

refrom pyspider.database.mysql.mysqldb import SQLfrom pyspider.libs.base_handler import *:headers= {“Accept”:”text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8″,”Accept-Encoding”:”gzip, deflate, sdch”,”Accept-Language”:”zh-CN,zh;q=0.8″,”Cache-Control”:”max-age=0″,”Connection”:”keep-alive”,”User-Agent”:”Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36″}crawl_config = {“headers” : headers,”timeout” : 100}:self.crawl(‘http://movie.douban.com/tag/’, callback=self.index_page):for each in response.doc(‘a[href^=”http”]’).items():if re.match(“http://movie.douban.com/tag/\w+”, each.attr.href, re.U):self.crawl(each.attr.href, callback=self.list_page):for each in response.doc(‘html > body > div#wrapper > div#content > div.grid-16-8.clearfix > div.article > div > table tr.item > td > div.pl2 > a’).items():self.crawl(each.attr.href, priority=9, callback=self.detail_page):return {“url”: response.url,”title”: response.doc(‘html > body > #wrapper > #content > h1 > span’).text(),”direct”: “,”.join(x.text() for x in response.doc(‘a[rel=”v:directedBy”]’).items()),”performer”: “,”.join(x.text() for x in response.doc(‘a[rel=”v:starring”]’).items()),”type”: “,”.join(x.text() for x in response.doc(‘span[property=”v:genre”]’).items()),: “,”.join(x.text() for x in response.doc(‘span[property=”v:initialReleaseDate”]’).items()),”time”: “,”.join(x.text() for x in response.doc(‘span[property=”v:runtime”]’).items()),#”alias”: “”.join(x.text() for x in response.doc(‘a[rel=”v:starring”]’).items()),”score”: response.doc(‘.rating_num’).text(),”comments”: response.doc(‘html > body > div#wrapper > div#content > div.grid-16-8.clearfix > div.article > div#comments-section > div.mod-hd > h2 > i’).text(),”scenario”: response.doc(‘html > body > div#wrapper > div#content > div.grid-16-8.clearfix > div.article > div.related-info > div#link-report.indent’).text(),”IMDb”: “”.join(x.text() for x in response.doc(‘span[href]’).items()),}:result[‘title’]:returnsql = SQL()sql.replace(‘douban_db’,**result)

关于上面这段代码,有下面几点需要说明的: a. 为了避免服务器判断出客户端在进行爬虫操作,从而禁止ip访问(具体表现为出现403禁止访问),我们需要在发出请求的时候加上一个http头,伪装成使用浏览器访问,具体用法如下:

headers= {“Accept”:”text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8″,”Accept-Encoding”:”gzip, deflate, sdch”,”Accept-Language”:”zh-CN,zh;q=0.8″,”Cache-Control”:”max-age=0″,”Connection”:”keep-alive”,”User-Agent”:”Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36″}crawl_config = {“headers” : headers,”timeout” : 100}

b. @every(minutes=24 * 60)表示每天执行一次 @config(age=10 * 24 * 60 * 60)表示数据10天后就过期了

如果雨后还是雨,如果忧伤过后还是忧伤,

pyspider爬虫的一个应用

相关文章:

你感兴趣的文章:

标签云: