使用Scrapy抓取Python数据

我想从具有TextFields,Buttons等的网站上抓取数据,而我的要求是填写文本字段并提交表单以获取结果,然后从结果页面抓取数据点。

我想知道Scrapy是否具有此功能,或者是否有人可以推荐Python中的库来完成此任务?

(已编辑)

我的要求是从ComboBoxes中选择值,然后单击搜索按钮,然后从结果页面抓取数据点。

PS我正在使用selenium Firefox驱动程序从其他网站抓取数据,但是该解决方案不好,因为selenium Firefox驱动程序依赖于FireFox的EXE,即在运行抓取工具之前必须先安装Firefox。

Selenium Firefox驱动程序每个实例消耗约100MB内存,而我的要求是一次运行很多实例以加快抓取过程,因此也存在内存限制。

Firefox在执行抓取工具时有时会崩溃,不知道为什么。另外,我需要更少的窗口抓取功能,这对于Selenium Firefox驱动程序是不可能的。

我的最终目标是在Heroku上运行刮板,并且在那里有Linux环境,因此seleniumFirefox驱动程序将无法在Heroku上运行。谢谢

回答:

基本上,你有很多工具可供选择:

  • scrapy
  • beautifulsoup
  • lxml
  • mechanize
  • requests (and grequests)
  • selenium
  • ghost.py

这些工具具有不同的用途,但可以根据任务将它们混合在一起。

Scrapy是用于抓取网站,提取数据的功能强大且非常智能的工具。但是,当涉及到操作页面时:单击按钮,填写表格-变得更加复杂:

  • 有时,通过直接在scrapy中直接进行基础表单操作来模拟填充/提交表单很容易
  • 有时,你必须使用其他工具来帮助刮伤-如机械化或硒化

如果你使问题更具体,这将有助于你了解应该使用或选择哪种工具。

让我们看一个有趣的scrapy&硒混合物的例子。在这里,硒任务是单击按钮并提供刮擦物品的数据:

import time

from scrapy.item import Item, Field

from selenium import webdriver

from scrapy.spider import BaseSpider

class ElyseAvenueItem(Item):

name = Field()

class ElyseAvenueSpider(BaseSpider):

name = "elyse"

allowed_domains = ["ehealthinsurance.com"]

start_urls = [

'http://www.ehealthinsurance.com/individual-family-health-insurance?action=changeCensus&census.zipCode=48341&census.primary.gender=MALE&census.requestEffectiveDate=06/01/2013&census.primary.month=12&census.primary.day=01&census.primary.year=1971']

def __init__(self):

self.driver = webdriver.Firefox()

def parse(self, response):

self.driver.get(response.url)

el = self.driver.find_element_by_xpath("//input[contains(@class,'btn go-btn')]")

if el:

el.click()

time.sleep(10)

plans = self.driver.find_elements_by_class_name("plan-info")

for plan in plans:

item = ElyseAvenueItem()

item['name'] = plan.find_element_by_class_name('primary').text

yield item

self.driver.close()

更新:

这是有关如何在你的情况下使用scrapy的示例:

from scrapy.http import FormRequest

from scrapy.item import Item, Field

from scrapy.selector import HtmlXPathSelector

from scrapy.spider import BaseSpider

class AcrisItem(Item):

borough = Field()

block = Field()

doc_type_name = Field()

class AcrisSpider(BaseSpider):

name = "acris"

allowed_domains = ["a836-acris.nyc.gov"]

start_urls = ['http://a836-acris.nyc.gov/DS/DocumentSearch/DocumentType']

def parse(self, response):

hxs = HtmlXPathSelector(response)

document_classes = hxs.select('//select[@name="combox_doc_doctype"]/option')

form_token = hxs.select('//input[@name="__RequestVerificationToken"]/@value').extract()[0]

for document_class in document_classes:

if document_class:

doc_type = document_class.select('.//@value').extract()[0]

doc_type_name = document_class.select('.//text()').extract()[0]

formdata = {'__RequestVerificationToken': form_token,

'hid_selectdate': '7',

'hid_doctype': doc_type,

'hid_doctype_name': doc_type_name,

'hid_max_rows': '10',

'hid_ISIntranet': 'N',

'hid_SearchType': 'DOCTYPE',

'hid_page': '1',

'hid_borough': '0',

'hid_borough_name': 'ALL BOROUGHS',

'hid_ReqID': '',

'hid_sort': '',

'hid_datefromm': '',

'hid_datefromd': '',

'hid_datefromy': '',

'hid_datetom': '',

'hid_datetod': '',

'hid_datetoy': '', }

yield FormRequest(url="http://a836-acris.nyc.gov/DS/DocumentSearch/DocumentTypeResult",

method="POST",

formdata=formdata,

callback=self.parse_page,

meta={'doc_type_name': doc_type_name})

def parse_page(self, response):

hxs = HtmlXPathSelector(response)

rows = hxs.select('//form[@name="DATA"]/table/tbody/tr[2]/td/table/tr')

for row in rows:

item = AcrisItem()

borough = row.select('.//td[2]/div/font/text()').extract()

block = row.select('.//td[3]/div/font/text()').extract()

if borough and block:

item['borough'] = borough[0]

item['block'] = block[0]

item['doc_type_name'] = response.meta['doc_type_name']

yield item

保存spider.py并通过和运行scrapy runspider spider.py -o output.json,output.json你将看到:

{"doc_type_name": "CONDEMNATION PROCEEDINGS ", "borough": "Borough", "block": "Block"}

{"doc_type_name": "CERTIFICATE OF REDUCTION ", "borough": "Borough", "block": "Block"}

{"doc_type_name": "COLLATERAL MORTGAGE ", "borough": "Borough", "block": "Block"}

{"doc_type_name": "CERTIFIED COPY OF WILL ", "borough": "Borough", "block": "Block"}

{"doc_type_name": "CONFIRMATORY DEED ", "borough": "Borough", "block": "Block"}

{"doc_type_name": "CERT NONATTCHMENT FED TAX LIEN ", "borough": "Borough", "block": "Block"}

...

希望能有所帮助。

以上是 使用Scrapy抓取Python数据 的全部内容, 来源链接: utcz.com/qa/413848.html

回到顶部