preface:最近学习工作之外,有个朋友需要爬取动态网页的要求,输入关键词爬取某个专利网站在该关键词下的一些专利说明。以往直接python urllib2可破,但是那只是对于静态网页可破,但是对于用js等其他的生成的动态网页的话,则貌似不行(没试过)。然后在网上找了些资料,发现scrapy结合selenium包好像可以。(之所以这么说,暂时卤主也还没实现,先记录下来。)
#=====================根据官网中简单的介绍作个人理解========================
首先,安装scrapy,selenium两个包:
卤主在ubuntu下,并且已经安装好了anaconda和pip以及easy_intasll,所以直接用pip安装一步到位(或者easy_install):
pip install -U selenium pip install Scrapy easy_install -U selenium easy_install Scrapy
其次,需要用scrapy新建项目,在终端运行如下命令新建项目:
则自动生成如下形式的文件夹:scrapy startproject tutorial
Figure 1:新建项目后的文件夹
再次,开始编写项目:
在items.py文件中需要定义一些变量:
import scrapy class DmozItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field()
在文件夹tutorial/spiders
下新建dmoz_spider.py
文件:
在该文件中需要定义三个变量,其一为name,start_urls,parse这三个变量。import scrapy class DmozSpider(scrapy.Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): filename = response.url.split("/")[-2] with open(filename, 'wb') as f: f.write(response.body)
最后,在最外层文件夹下终端运行:
scrapy crawl dmoz
dmoz为文件夹tutorial/spiders
下新建的文件中DmozSpider类中重要的变量之一name的值。便能开始爬取。
#=============================================
博友:http://chenqx.github.io/2014/12/23/Spider-Advanced-for-Dynamic-Website-Crawling/
介绍了抓取动态网站的一些内容,并且在github上共享了完整的项目代码。(先下载代码,对着代码看文档)
其gouwu.sogou.com任务为动态抓取页面信息。
卤主针对自己的任务,更改其gouwu.sogou.com/etao/lstData.py文件,里面lstData类lst列表变量里面为搜索的关键词,传入到spider.py文件,组成url,开始爬取。
分析博友的代码没找到爬取下来的动态页面信息存在哪里的代码,
在spider.py文件中加入自己的代码:
def parse(self, response):
#crawl all display page
for link in self.link_extractor['page_down'].extract_links(response):
yield Request(url = link.url, callback=self.parse)
#browser
self.browser.get(response.url)
time.sleep(5)
# get the data and write it to scrapy items
etaoItem_loader = ItemLoader(item=EtaoItem(), response = response)
url = str(response.url)
etaoItem_loader.add_value('url', url)
etaoItem_loader.add_xpath('title', self._x_query['title'])
etaoItem_loader.add_xpath('name', self._x_query['name'])
etaoItem_loader.add_xpath('price', self._x_query['price'])
#====================================
# for link in self.link_extractor['page_down'].extract_links(response):
# yield Request(url = link.url, callback = self.parse_detail)
for sel in response.xpath('//ul/li'):
title = sel.xpath('a/text()').extract()
link2 = sel.xpath('a/@href').extract()
desc = sel.xpath('text()').extract()
for i in title:
print i,
for j in link2:
print j,"+++++++++++++"
#====================================
yield etaoItem_loader.load_item()
#=============================================
卤主参考的一些资料:
scrapy官网:http://doc.scrapy.org/en/latest/intro/tutorial.html
scrapy中文翻译:http://scrapy-chs.readthedocs.org/zh_CN/latest/
selenium官网:http://selenium-python.readthedocs.org/
scrapy选择器:http://doc.scrapy.org/en/0.24/topics/selectors.html#topics-selectors
博友博客:http://blog.csdn.net/pleasecallmewhy/article/details/19642329
博友博客:http://chenqx.github.io/2014/12/23/Spider-Advanced-for-Dynamic-Website-Crawling/
博友博客:http://chenqx.github.io/2014/11/09/Scrapy-Tutorial-for-BBSSpider/
博友博客(selenium):http://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html
存取问题:http://my.oschina.net/HappyRoad/blog/173510