根据Scrapy Documetions我想从几个站点抓取数据,我的代码可以正常工作在通常的网站上,但是当我想用Sucuri抓取一个网站时,我没有得到任何数据,Sucuri防火墙似乎阻止了我访问网站标记。在
目标网站是http://www.dwarozh.net/,并且 这是我的蜘蛛片段
from scrapy import Spider
from scrapy.selector import Selector
import scrapy
from Stack.items import StackItem
from bs4 import BeautifulSoup
from scrapy import log
from scrapy.utils.response import open_in_browser
class StackSpider(Spider):
name = "stack"
start_urls = [
"http://www.dwarozh.net/sport/",
]
def parse(self, response):
mItems = Selector(response).xpath('//div[@class="news-more-img"]/ul/li')
for mItem in mItems:
item = StackItem()
item['title'] = mItem.xpath(
'a/h2/text()').extract_first()
item['url'] = mItem.xpath(
'viewa/@href').extract_first()
yield item
这就是我得到的结果
^{pr2}$我怎样才能绕过sucuri?
站点使用基于cookie和用户代理的保护。你可以这样检查。在Chrome中打开DevTools。导航到目标页面http://www.dwarozh.net/sport/,然后在“网络”选项卡中右键单击该页面的请求并“复制为CURL” 打开控制台并运行卷曲:
您将看到普通的html代码。如果从请求中删除用户代理的cookie,则会得到cap页。在
让我们来查一查吧:
^{pr2}$太好了!让我们做一只蜘蛛:
我修改了你的,因为我没有一些组件的源代码。在
让我们运行它:
你可能需要不时更新cookies。你可以使用幻影。在
更新:
如何使用PhantomJS获取cookies。在
安装PhantomJS。
编写如下脚本
dwarosh.js
:运行脚本:
获取cookie
sucuri_cloudproxy_uuid_3e07984e4
,并尝试使用curl
和相同的用户代理来获取页面。在解析动态内容的一般解决方案是首先使用能够运行Javascript的东西(例如http://phantomjs.org/)来获得呈现的dom/html,然后保存html并将其提供给解析器。在
这也有助于绕过一些基于js的保护器。在
phantomjs
是一个单独的可执行文件,它将加载一个uri作为一个真正的浏览器,并对所有JS进行评估。 您可以通过subprocess.call([phantomJsPath, jsProgramPath, url, htmlFileToSave])
从Python运行它对于jsProgram示例,可以检查https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js
要从js程序保存html,请使用
fs.write(htmlFileToSave, page.content, "w");
我试过这种方法矮人网它是有效的,尽管你应该弄清楚如何将它插入你的
scrapy
管道中。在对于您的示例,您可以尝试“手动”解析提供的javascript,以获取加载实际页面所需的cookie详细信息。尽管Sucuri算法随时可能改变,任何基于cookie或js解码的解决方案都会被破坏。在
相关问题 更多 >
编程相关推荐