我试图通过向项目配置文件添加额外的行来覆盖我的crawlspider的用户代理.这是代码:
[settings]
default = myproject.settings
USER_AGENT = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"
[deploy]
#url = http://localhost:6800/
project = myproject
Run Code Online (Sandbox Code Playgroud)
但是当我对自己的网络运行爬虫时,我注意到蜘蛛没有拿起我的自定义用户代理,而是默认的"Scrapy/0.18.2(+ http://scrapy.org)".任何人都可以解释我做错了什么.
注意:
scrapy crawl myproject.com -o output.csv -t csv -s USER_AGENT="Mozilla...."
Run Code Online (Sandbox Code Playgroud)
(2).当我从配置文件中删除"default = myproject.setting"行并运行scrapy crawl myproject.com时,它说"找不到蜘蛛......",所以我觉得在这种情况下不应该删除默认设置.
非常感谢您的帮助.
我有一个形式的网址:
example.com/foo/bar/page_1.html
Run Code Online (Sandbox Code Playgroud)
总共有53页,每页有~20行.
我基本上想要从所有页面获取所有行,即~53*20项.
我在我的parse方法中有工作代码,它解析单个页面,并且每个项目也更深入一页,以获得有关该项目的更多信息:
def parse(self, response):
hxs = HtmlXPathSelector(response)
restaurants = hxs.select('//*[@id="contenido-resbus"]/table/tr[position()>1]')
for rest in restaurants:
item = DegustaItem()
item['name'] = rest.select('td[2]/a/b/text()').extract()[0]
# some items don't have category associated with them
try:
item['category'] = rest.select('td[3]/a/text()').extract()[0]
except:
item['category'] = ''
item['urbanization'] = rest.select('td[4]/a/text()').extract()[0]
# get profile url
rel_url = rest.select('td[2]/a/@href').extract()[0]
# join with base url since profile url is relative
base_url = get_base_url(response)
follow = urljoin_rfc(base_url,rel_url)
request = Request(follow, callback = parse_profile)
request.meta['item'] = item
return request
def parse_profile(self, …Run Code Online (Sandbox Code Playgroud) 问题是直截了当的,但有些背景可能有所帮助.
我正在尝试使用selenium和phantomjs作为下载程序来部署scrapy.但问题是它在尝试部署时继续说权限被拒绝.所以我想改变ghostdriver.log的路径或者只是禁用它.看着phantomjs -h和ghostdriver github页面我找不到答案,我的朋友google也让我失望了.
$ scrapy deploy
Building egg of crawler-1370960743
'build/scripts-2.7' does not exist -- can't clean it
zip_safe flag not set; analyzing archive contents...
tests.fake_responses.__init__: module references __file__
Deploying crawler-1370960743 to http://localhost:6800/addversion.json
Server response (200):
Traceback (most recent call last):
File "/usr/lib/pymodules/python2.7/scrapyd/webservice.py", line 18, in render
return JsonResource.render(self, txrequest)
File "/usr/lib/pymodules/python2.7/scrapy/utils/txweb.py", line 10, in render
r = resource.Resource.render(self, txrequest)
File "/usr/lib/python2.7/dist-packages/twisted/web/resource.py", line 216, in render
return m(request)
File "/usr/lib/pymodules/python2.7/scrapyd/webservice.py", line 66, in render_POST
spiders = get_spider_list(project)
File "/usr/lib/pymodules/python2.7/scrapyd/utils.py", …Run Code Online (Sandbox Code Playgroud) 我想使用scrapy来抓取网页.有没有办法从终端本身传递起始URL?
在文档中给出了可以给出蜘蛛的名称或URL,但是当我给出url时它会抛出一个错误:
//我的蜘蛛的名字就是例子,但是我给的是url而不是我的蜘蛛名字(如果我给蜘蛛名字,它可以正常工作).
scrapy crawl example.com
错误:
文件"/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.egg/scrapy/spidermanager.py",第43行,在create raise KeyError("未找到蜘蛛:% s"%spider_name"KeyError:'找不到蜘蛛:example.com'
如何让scrapy在终端上给出的url上使用我的蜘蛛?
我已经使用scrapy编写了一个正在运行的爬虫,
现在我想通过Django webapp来控制它,也就是说:
start_urlsallowed_domainssettings值起初我认为scrapyd是为此而制作的,但在阅读了文档之后,似乎它更像是一个能够管理"打包蜘蛛"的守护进程,也就是"scrapy eggs"; 并且所有的设置(start_urls,allowed_domains,settings)仍必须在"scrapy鸡蛋"本身硬编码; 所以它看起来不像我的问题的解决方案,除非我错过了什么.
我还看了这个问题:如何为scrapy提供URL以进行爬行?; 但提供多个网址的最佳答案是由作者himeslf认定为"丑陋的黑客",涉及一些python子进程和复杂的shell处理,所以我认为这里找不到解决方案.此外,它可能适用start_urls,但它似乎不允许allowed_domains或settings.
然后我看了scrapy webservices:它似乎是检索统计数据的好方法.但是,它仍然需要一个正在运行的蜘蛛,并且没有改变的线索settings
关于这个问题有几个问题,似乎没有一个问题令人满意:
我知道scrapy用于生产环境; 像scrapyd这样的工具表明,确实有一些方法可以满足这些要求(我无法想象用于处理的scrapy egg scrap是手工生成的!)
非常感谢你的帮助.
我希望scrapy抓取页面,进入下一个链接看起来像这样:
<a href="#" onclick="return gotoPage('2');"> Next </a>
Run Code Online (Sandbox Code Playgroud)
scrapy能解释那个javascript代码吗?
通过livehttpheaders扩展,我发现单击Next会生成一个POST,其中包含一个非常大的"垃圾",如下所示:
encoded_session_hidden_map=H4sIAAAAAAAAALWZXWwj1RXHJ9n
Run Code Online (Sandbox Code Playgroud)
我正在尝试在CrawlSpider类上构建我的蜘蛛,但我无法弄清楚如何对它进行编码,BaseSpider我使用该parse()方法处理第一个URL,这恰好是一个登录表单,我在其中执行了一个POST:
def logon(self, response):
login_form_data={ 'email': 'user@example.com', 'password': 'mypass22', 'action': 'sign-in' }
return [FormRequest.from_response(response, formnumber=0, formdata=login_form_data, callback=self.submit_next)]
Run Code Online (Sandbox Code Playgroud)
然后我定义了submit_next()来告诉下一步该做什么.我无法弄清楚如何告诉CrawlSpider在第一个URL上使用哪种方法?
我抓取的所有请求(第一个除外)都是POST请求.它们交替使用两种类型的请求:粘贴一些数据,然后单击"下一步"转到下一页.
我正在抓取一个网站,该网站可能包含很多start_urls,例如http://www.a.com/list_1_2_3.htm.
我想填充[list_\d + \ d +\d + .htm]之类的start_urls ,并在抓取过程中从[node_\d + .htm]等网址中提取项目.
我可以使用CrawlSpider来实现这个功能吗?如何在爬行中动态生成start_urls?
非常感谢!
我正在使用复杂的分层信息来抓取一些数据,并且需要将结果导出到json.
我将这些项目定义为
class FamilyItem():
name = Field()
sons = Field()
class SonsItem():
name = Field()
grandsons = Field()
class GrandsonsItem():
name = Field()
age = Field()
weight = Field()
sex = Field()
Run Code Online (Sandbox Code Playgroud)
当蜘蛛完成时,我会得到一个打印的项目输出
{'name': 'Jenny',
'sons': [
{'name': u'S1',
'grandsons': [
{'name': u'GS1',
'age': 18,
'weight': 50
},
{
'name':u'GS2',
'age': 19,
'weight':51}]
}]
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行时scrapy crawl myscaper -o a.json,它总是说结果"不是JSON可序列化的".然后我将项目输出复制并粘贴到ipython控制台并使用json.dumps(),它工作正常.所以问题出在哪里?这是我的疯狂......
如何从项目管道访问settings.py中的scrapy设置.文档提到可以通过扩展中的爬虫访问它,但我没有看到如何访问管道中的爬虫.
我是Scrapy的新学习者.我安装了python 2.7和所有其他所需的引擎.
然后我尝试按照教程http://doc.scrapy.org/en/latest/intro/tutorial.html构建一个Scrapy项目.
在抓取步骤中,我键入后scrapy crawl dmoz 生成此错误消息
ImportError: No module named win32api.
[twisted] CRITICAL : Unhandled error in deferred
Run Code Online (Sandbox Code Playgroud)
我正在使用Windows.
堆栈跟踪:
scrapy ×10
python ×7
web-crawler ×3
web-scraping ×2
ghostdriver ×1
javascript ×1
json ×1
onclick ×1
phantomjs ×1
pipeline ×1
scrapyd ×1
settings ×1
user-agent ×1