我正在废弃一个网站,我在scrapy中写了一个蜘蛛,但我能够使用这个提取产品价格:
hxs.select('//div[@class="product_list"]//div[@class="product_list_offerprice"]/text()').extract()
Run Code Online (Sandbox Code Playgroud)
通过scrapy shell
但是当我试图用蜘蛛做同样的事情时它会返回空列表
这是我的蜘蛛代码:
from eScraper.items import EscraperItem
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import CrawlSpider
#------------------------------------------------------------------------------
class ESpider(CrawlSpider):
name = "ashikamallSpider"
allowed_domains = ["ashikamall.com"]
URLSList = []
for n in range (1,51):
URLSList.append('http://ashikamall.com/products.aspx?id=222&page=' + str(n))
start_urls = URLSList
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//div[@class="product_list"]')
items = []
for site in sites:
item = EscraperItem()
item['productDesc'] = ""
item['productSite'] = "http://1click1call.com/"
item['productTitle'] = site.select('div[@class="product_list_name"]/h3/text()').extract()
item['productPrice'] = site.select('div[@class="product_list_offerprice"]/text()').extract()
item['productURL'] = "http://ashikamall.com/" + site.select('div[@class="product_list_image"]/a/@href').extract()[0].encode('utf-8')
item['productImage'] …Run Code Online (Sandbox Code Playgroud) 我想要做的是在spider.py文件中的不同函数中填充item.py中定义的项目字段,例如在发出所有请求的start_requests函数中,我想填充一个名为“item_id”的字段'。
def start_requests(self):
forms = []
for item in self.yhd_items:
self.item["item_id"] = item.ItemCode
forms.append(FormRequest(self.base_url + item.ItemCode, method='GET',
callback = self.parse_search_result))
return forms
Run Code Online (Sandbox Code Playgroud)
请注意,我在 init 函数中创建了一个项目实例。这样就只填充 item_id 字段并传递给下一个解析器方法(parse_search_result)。item.py 中的其他字段将在下一个函数中填充并再次传递给另一个解析器方法。会是合法的吗?
我正在尝试使用 Scrapy 提交动态生成的用户登录表单,然后解析页面上与成功登录相对应的 HTML。
我想知道如何使用 Scrapy 或 Scrapy 和 Selenium 的组合来做到这一点。Selenium 使得在 DOM 上找到元素成为可能,但我想知道是否有可能在获得完整的 HTML 后将控制权“交还”给 Scrapy,以允许它执行表单提交并保存必要的 cookie ,会话数据等以抓取页面。
基本上,我认为 Selenium 是必要的唯一原因是因为我需要在 Scrapy 查找<form>元素之前从 Javascript 呈现页面。但是,有没有其他替代方法?
谢谢!
编辑:这个问题类似于这一个,但不幸的请求库而不是硒或Scrapy接受的答案交易。尽管在某些情况下可能出现这种情况(观看此内容以了解更多信息),但正如 alecxe 指出的那样,如果“页面的某些部分 [例如表单] 通过 API 调用加载并在帮助下插入到页面中,则可能需要 Selenium在浏览器中执行的 javascript 代码”。
我正在为wunderground.com构建网络刮板,但是我的代码返回了inchs_rain和湿度的“ []”值。谁能知道为什么会这样吗?
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
import time
from wunderground_scraper.items import WundergroundScraperItem
class WundergroundComSpider(scrapy.Spider):
name = "wunderground"
allowed_domains = ["www.wunderground.com"]
start_urls = (
'http://www.wunderground.com/q/zmw:10001.5.99999',
)
def parse(self, response):
info_set = Selector(response).xpath('//div[@id="current"]')
list = []
for i in info_set:
item = WundergroundScraperItem()
item['description'] = i.xpath('div/div/div/div/span/text()').extract()
item['description'] = item['description'][0]
item['humidity'] = i.xpath('div/table/tbody/tr/td/span/span/text()').extract()
item['inches_rain'] = i.xpath('div/table/tbody/tr/td/span/span/text()').extract()
list.append(item)
return list
Run Code Online (Sandbox Code Playgroud)
我也知道湿度和inches_rain项目设置为相同的xpath,但这应该是正确的,因为一旦信息进入数组,我就将它们设置为数组中的某些值。
我创建了一个非常慢的新 Scrapy 蜘蛛。它每秒只能抓取大约两页,而我创建的其他 Scrapy 爬虫的抓取速度要快得多。
我想知道是什么导致了这个问题,以及如何解决这个问题。该代码与其他蜘蛛并没有太大不同,我不确定它是否与问题有关,但如果您认为可能涉及到它,我会添加它。
事实上,我的印象是请求不是异步的。我从来没有遇到过这种问题,而且我对 Scrapy 还是很陌生。
编辑
这是蜘蛛:
class DatamineSpider(scrapy.Spider):
name = "Datamine"
allowed_domains = ["domain.com"]
start_urls = (
'http://www.example.com/en/search/results/smth/smth/r101/m2108m',
)
def parse(self, response):
for href in response.css('.searchListing_details .search_listing_title .searchListing_title a::attr("href")'):
url = response.urljoin(href.extract())
yield scrapy.Request(url, callback=self.parse_stuff)
next_page = response.css('.pagination .next a::attr("href")')
next_url = response.urljoin(next_page.extract()[0])
yield scrapy.Request(next_url, callback=self.parse)
def parse_stuff(self, response):
item = Item()
item['value'] = float(response.xpath('//*[text()="Price" and not(@class)]/../../div[2]/span/text()').extract()[0].split(' ')[1].replace(',',''))
item['size'] = float(response.xpath('//*[text()="Area" and not(@class)]/../../div[2]/text()').extract()[0].split(' ')[0].replace(',', '.'))
try:
item['yep'] = float(response.xpath('//*[text()="yep" and not(@class)]/../../div[2]/text()').extract()[0])
except IndexError:
print …Run Code Online (Sandbox Code Playgroud) 当我尝试HtmlResponse在Scrapy中构造一个像这样的对象:
scrapy.http.HtmlResponse(url=self.base_url + dealer_url[0], body=dealer_html)
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
Traceback (most recent call last):
File "d:\kerja\hit\python~1\<project_name>\<project_name>\lib\site-packages\twisted\internet\defer.py", line 588, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "D:\Kerja\HIT\Python Projects\<project_name>\<project_name>\<project_name>\<project_name>\spiders\fwi.py", line 69, in parse_items
dealer_page = scrapy.http.HtmlResponse(url=self.base_url + dealer_url[0], body=dealer_html)
File "d:\kerja\hit\python~1\<project_name>\<project_name>\lib\site-packages\scrapy\http\response\text.py", line 27, in __init__
super(TextResponse, self).__init__(*args, **kwargs)
File "d:\kerja\hit\python~1\<project_name>\<project_name>\lib\site-packages\scrapy\http\response\__init__.py", line 18, in __init__
self._set_body(body)
File "d:\kerja\hit\python~1\<project_name>\<project_name>\lib\site-packages\scrapy\http\response\text.py", line 43, in _set_body
type(self).__name__)
TypeError: Cannot convert unicode body - HtmlResponse has no encoding
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个错误?
我已经被困在这几天了,这让我发疯了.
我这样叫我的scrapy蜘蛛:
scrapy crawl example -a follow_links="True"
Run Code Online (Sandbox Code Playgroud)
我传入"follow_links"标志来确定是否应该删除整个网站,或者只是我在蜘蛛中定义的索引页面.
在spider的构造函数中检查此标志以查看应设置的规则:
def __init__(self, *args, **kwargs):
super(ExampleSpider, self).__init__(*args, **kwargs)
self.follow_links = kwargs.get('follow_links')
if self.follow_links == "True":
self.rules = (
Rule(LinkExtractor(allow=()), callback="parse_pages", follow=True),
)
else:
self.rules = (
Rule(LinkExtractor(deny=(r'[a-zA-Z0-9]*')), callback="parse_pages", follow=False),
)
Run Code Online (Sandbox Code Playgroud)
如果它是"真",则允许所有链接; 如果它是"假",则所有链接都被拒绝.
到目前为止,这么好,但这些规则被忽略了.我可以获得遵循规则的唯一方法是在构造函数之外定义它们.这意味着,像这样的东西会正常工作:
class ExampleSpider(CrawlSpider):
rules = (
Rule(LinkExtractor(deny=(r'[a-zA-Z0-9]*')), callback="parse_pages", follow=False),
)
def __init__(self, *args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)
所以基本上,在__init__构造函数中定义规则会导致规则被忽略,而在构造函数之外定义规则会按预期工作.
我不明白这.我的代码如下.
import re
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from w3lib.html import remove_tags, remove_comments, replace_escape_chars, replace_entities, remove_tags_with_content …Run Code Online (Sandbox Code Playgroud) 我是Scrapy和Python的新手.我正在尝试使用Scrapy示例中的FormRequest,但似乎formdata参数未解析"Air"中的"[]".关于解决方法的任何想法?这是代码:
import scrapy
import re
import json
from scrapy.http import FormRequest
class AirfareSpider(scrapy.Spider):
name = 'airfare'
start_urls = [
'http://www.viajanet.com.br/busca/voos-resultados#/POA/MEX/RT/01-03-2017/15-03-2017/-/-/-/1/0/0/-/-/-/-'
]
def parse(self, response):
return [FormRequest(url='http://www.viajanet.com.br/busca/resources/api/AvailabilityStatusAsync',
formdata={"Partner":{
"Token":"p0C6ezcSU8rS54+24+zypDumW+ZrLkekJQw76JKJVzWUSUeGHzltXDhUfEntPPLFLR3vJpP7u5CZZYauiwhshw==",
"Key":"OsHQtrHdMZPme4ynIP4lcsMEhv0=",
"Id":"52",
"ConsolidatorSystemAccountId":"80",
"TravelAgencySystemAccountId":"80",
"Name":"B2C"
},
"Air":[{
"Arrival":{
"Iata":"MEX",
"Date":"2017-03-15T15:00:00.000Z"
},
"Departure":{
"Iata":"POA",
"Date":"2017-03-01T15:00:00.000Z"
},
"InBoundTime":"0",
"OutBoundTime":"0",
"CiaCodeList":"[]",
"BookingClass":"-1",
"IsRoundTrip":"true",
"Stops":"-1",
"FareType":"-"
}],
"Pax":{
"adt":"1",
"chd":"0",
"inf":"0"
},
"DisplayTotalAmount":"false",
"GetDeepLink":"false",
"GetPriceMatrixOnly":"false",
"PageLength":"10",
"PageNumber":"2"
}
, callback=self.parse_airfare)]
def parse_airfare(self, response):
data = json.loads(response.body)
Run Code Online (Sandbox Code Playgroud) 我想将scrapy作为python脚本运行,但我不知道如何正确设置设置或如何提供它们。我不确定这是否是设置问题,但我认为是。
我的配置:
我接受了https://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script的建议来让它运行。我对以下建议有一些问题:
如果您在 Scrapy 项目中,则可以使用一些额外的帮助程序将这些组件导入项目中。您可以自动导入将其名称传递给 CrawlerProcess 的蜘蛛,并使用 get_project_settings 获取带有项目设置的 Settings 实例。
那么“在 Scrapy 项目中”是什么意思?当然,我必须导入库并安装依赖项,但我想避免使用scrapy crawl xyz.
这是 myScrapy.py 的代码
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.item import Item, Field
import os, argparse
#Initialization of directories
projectDir = os.path.dirname(os.path.realpath('__file__'))
generalOutputDir = os.path.join(projectDir, 'output')
parser = argparse.ArgumentParser()
parser.add_argument("url", help="The url which you want to scan", type=str)
args …Run Code Online (Sandbox Code Playgroud) 实际上我想将与特定网站相关的所有数据(文本,参考,图像)存储到一个文件夹中。为此,我需要将该文件夹的路径传递给所有不同的解析函数。所以我想传递此路径scrapy.Request()像这样额外的垃圾:
yield scrapy.Request(url=url,dont_filter=True, callback=self.parse,errback = self.errback_function,kwargs={'path': '/path/to_folder'})
但是它给出了错误 TypeError: __init__() got an unexpected keyword argument 'kwargs'
如何将该路径传递给下一个功能?
python ×10
scrapy ×10
scrapy-spider ×10
web-scraping ×4
python-2.7 ×2
xpath ×2
encoding ×1
selenium ×1
web-crawler ×1