【问题标题】:Webscraping with Python/scrapy (does this code work)使用 Python/scrapy 进行网页抓取(此代码是否有效)
【发布时间】:2013-08-20 00:33:55
【问题描述】:

我是一个 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

这是phones.csv文件中的一些示例数字

01253873647
01253776535
01142726749

【问题讨论】:

  • 一些评论/问题:“[”在哪里检索?你的start_requests 对我来说似乎没用,因为你在那里什么都不做。为什么不用start_requests 函数替换你的parse_main_page?毕竟这是你真正开始工作的地方,你不需要先连接到网站然后回调这个函数。你确定你在after_post函数中爬取的页面是正确的吗?你应该在after_post 的开头插入一个pdb (docs.python.org/2/library/pdb.html),看看你真正在解析什么。并且您的最终 xpath 可以缩短!

标签: python web-scraping screen-scraping scrapy


【解决方案1】:

有关获取 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()

【讨论】:

  • 我本可以使用 API,但由于我试图学习这种抓取方法,而且我的项目并不是关于 samknows.com,我真的很想知道为什么我无法将上述内容发布到抓取任何数据。但感谢您抽出宝贵时间。
【解决方案2】:

您的蜘蛛代码不起作用的原因是您的缩进不正确。我编辑了您的问题以正确缩进代码,假设缩进错误是复制粘贴问题。请完全按照发布的方式复制上面的更新代码,蜘蛛就会工作。

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 2023-04-03
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2015-10-23
    • 2011-10-21
    相关资源
    最近更新 更多