使用Python / scrapy进行Web Scraping(此代码是否有效)

时间:2013-08-17 20:29:06

标签: python web-scraping screen-scraping scrapy

我是一个python新手和一个新手,试图学习一些python,主要是用它来刮。我设法做了一些简单的刮刀,但现在我正在开发一个更高级的脚本。

使用csv文件,我尝试按col读取col,并且列中的每个值都将在webform中发布此值。

我在stackoverflow上找到了一个完全正确的脚本,但我不能让它为我刮掉任何东西,因为我不明白所有这些我很难让我的mainspider也正常工作。

蜘蛛爬行,但它返回的唯一东西就是一个“[”

这是较旧的帖子Click

以下是蜘蛛的代码。

import csv
from scrapy.item import Item, Field

from scrapy.spider import BaseSpider
from scrapy.http import Request
from scrapy.http import FormRequest
from scrapy.selector import HtmlXPathSelector


class BtwItem(Item):
    fttcAvailable = Field()
    phoneNumber = Field()


class BtwSpider(BaseSpider):
    name = "btw"
    allowed_domains = ["samknows.com"]

    def start_requests(self):
        yield Request("http://www.samknows.com/broadband/broadband_checker", self.parse_main_page)

    def parse_main_page(self, response):
        with open('phones.csv', 'r') as f:
            reader = csv.reader(f)
            for row in reader:
                phone_number = row[0]
                yield FormRequest.from_response(response,
                                                formdata={'broadband_checker[phone]': phone_number},
                                                callback=self.after_post,
                                                meta={'phone_number': phone_number})

    def after_post(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//div[@id="results"]')

        phone_number = response.meta['phone_number']
        for site in sites:
            item = BtwItem()

            fttc = site.select("div[@class='content']/div[@id='btfttc']/ul/li/text()").extract()
            item['phoneNumber'] = phone_number
            item['fttcAvailable'] = 'not' in fttc[0]

            yield item

这是phone.csv文件中的som示例数字

01253873647
01253776535
01142726749

2 个答案:

答案 0 :(得分:0)

有关获取API访问权限的信息,请参阅此处: http://www.samknows.com/dataoutput

无论如何,这可能会让你开始:

import requests
from BeautifulSoup import BeautifulSoup

url = 'http://www.samknows.com/broadband/broadband_checker'
num = '01253873647'

data = {'broadband_checker[phone]': num, 
        'broadband_checker[postcode]': '',}

s = BeautifulSoup((requests.post(url, data=data)).text)
s.find('div', attrs={'id':'summary'}).prettify()

答案 1 :(得分:0)

您的蜘蛛代码无法正常工作的原因是您的缩进不正确。我编辑了您的问题以正确缩进代码,假设缩进错误是复制粘贴问题。请将上面更新的代码完全复制为已发布,并且蜘蛛可以正常工作。