我写了很多刮刀但是我不确定如何处理无限滚动条.这些天大多数网站等,Facebook,Pinterest都有无限的滚动条.
尝试解码无效的编码utf-8 html页面会在python,firefox和chrome中产生不同的结果.
测试页面中的无效编码片段如下所示 'PREFIX\xe3\xabSUFFIX'
>>> fragment = 'PREFIX\xe3\xabSUFFIX'
>>> fragment.decode('utf-8', 'strict')
...
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 6-8: invalid data
Run Code Online (Sandbox Code Playgroud)
更新:这个问题在Python unicode组件的bug报告中得出结论.据报道,该问题在Python 2.7.11和3.5.2中得到修复.
以下是用于处理Python,Firefox和Chrome中的解码错误的替换策略.注意它们是如何不同的,特别是python内置如何删除有效S(加上无效的字节序列).
内置replace错误处理程序用U + FFFD 替换无效\xe3\xab加上
SfromSUFFIX
>>> fragment.decode('utf-8', 'replace')
u'PREFIX\ufffdUFFIX'
>>> print _
PREFIX?UFFIX
Run Code Online (Sandbox Code Playgroud)
要测试浏览器如何解码无效的字节序列,将使用cgi脚本:
#!/usr/bin/env python
print """\
Content-Type: text/plain; charset=utf-8
PREFIX\xe3\xabSUFFIX"""
Run Code Online (Sandbox Code Playgroud)
Firefox和Chrome浏览器呈现:
PREFIX?SUFFIX
Run Code Online (Sandbox Code Playgroud)
replace错误处理程序str.decode正在删除SfromSUFFIX(更新1)
根据维基百科UTF-8(感谢mjv),以下字节范围用于指示字节序列的开始
'PREFIX\xe3\abSUFFIX' …
我试图通过向项目配置文件添加额外的行来覆盖我的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时,它说"找不到蜘蛛......",所以我觉得在这种情况下不应该删除默认设置.
非常感谢您的帮助.
如果不使用任何外部库,将网站的HTML内容提取到String中的最简单方法是什么?
现在我成功地从HTML页面抓取了完整的元素:
//img[@class='photo-large']
Run Code Online (Sandbox Code Playgroud)
例如它会返回:
<img src="http://example.com/img.jpg" class='photo-large' />
Run Code Online (Sandbox Code Playgroud)
但我只需要SRC网址(http://example.com/img.jpg).有帮助吗?
有没有办法从C#应用程序查看生成的网页源(所有AJAX调用和JavaScript DOM操作之后的代码),而无需从代码中打开浏览器?
使用WebRequest或WebClient对象查看初始页面工作正常,但如果页面大量使用JavaScript来更改页面加载时的DOM,则这些页面无法准确显示页面.
我尝试过使用Selenium和Watin UI测试框架,它们完美地工作,提供所有JavaScript操作完成后出现的生成源.不幸的是,他们通过打开一个非常慢的实际Web浏览器来实现这一点.我已经实现了一个selenium服务器,它将这项工作卸载到另一台机器上,但仍有很大的延迟.
是否有.Net库可以加载和解析页面(如浏览器)并吐出生成的代码?显然,谷歌和雅虎并没有为他们想要蜘蛛的每个页面开放浏览器(当然,他们可能拥有比我更多的资源......).
除非我愿意剖析开源浏览器的源代码,否则是否有这样的库或我运气不好?
解
好的,谢谢大家的帮助.我有一个比Selenium快10倍的工作解决方案.呜!
感谢来自beansoftware的这篇旧文章,我能够使用System.Windows.Forms.WebBrowser控件下载页面并解析它,然后给em生成源代码.即使控件在Windows.Forms中,你仍然可以从Asp.Net运行它(这就是我正在做的),只需记住将System.Window.Forms添加到项目引用中.
关于代码有两个值得注意的事情.首先,在新线程中调用WebBrowser控件.这是因为它必须在单线程公寓上运行.
其次,GeneratedSource变量设置在两个地方.这不是由于智能设计决定:)我还在努力,并在我完成后更新这个答案.多次调用wb_DocumentCompleted().首先下载初始HTML,然后在第一轮JavaScript完成时再次下载.不幸的是,我正在抓的网站有3个不同的加载阶段.1)加载初始HTML 2)执行第一轮JavaScript DOM操作3)暂停半秒然后进行第二轮JS DOM操作.
由于某种原因,第二轮不是由wb_DocumentCompleted()函数引起的,但是当wb.ReadyState == Complete时它总是被捕获.那么为什么不从wb_DocumentCompleted()中删除它呢?我仍然不确定为什么它没有被抓到那里,这是珠宝软件文章推荐的地方.我要继续研究它.我只是想发布这个代码,所以任何有兴趣的人都可以使用它.请享用!
using System.Threading;
using System.Windows.Forms;
public class WebProcessor
{
private string GeneratedSource{ get; set; }
private string URL { get; set; }
public string GetGeneratedHTML(string url)
{
URL = url;
Thread t = new Thread(new ThreadStart(WebBrowserThread));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
return GeneratedSource;
}
private void WebBrowserThread()
{
WebBrowser wb = new …Run Code Online (Sandbox Code Playgroud) 我有很多网站,并希望在一个页面上构建一个显示每个网站上实时访问者数量的信息中心.(还有其他人想要这个吗?)现在查看此信息的唯一方法是为每个站点打开一个新选项卡.
谷歌没有实时API,所以我想知道是否有可能刮掉这些数据.Eduardo Cereto发现Google通过实时/绑定网络请求传输实时数据.任何更精明的人都知道我应该如何开始?这就是我的想法:
检查所有实时/绑定请求以查看它们如何更改.每个请求都有唯一的密钥吗?它来自哪里?以下是我对请求的细分:
https://www.google.com/analytics/realtime/bind?VER=8
&key = [这是什么?它从何而来?21个字符小写字母数字,每个请求保持相同]
&ds = [这是什么?它从何而来?21个字符小写字母数字,每个请求保持相同]
&PAGEID = RT-标准%2Frt-概述
&Q = T%3A0%7C%3A1%3A0%3A%2CT%3A11%7C%3A1%3A5%3A%2Cot%3A0%3A0%3A4%2Cot%3A0%3A0%3A3%2CT%3A7%7C%3A1% 3A10%3A6%3D%3DREFERRAL%3B%2CT%3A10%7C%3A1%3A10%3A%2CT%3A18%7C%3A1%3A10%3A%2CT%3A4%7C5%7C2%7C%3A1%3A10%3A2! %3Dzz%3B%2C&F
q变量URI解码为this(是什么?):t:0 |:1:0:,t:11 |:1:5:,ot:0:0:4,ot:0:0:3,t :7 |:1:10:6 ==转诊;,T:10 |:1:10:,T:18 |:1:10:,T:4 | 5 | 2 |:1:10:2 = ZZ;,&F
&RID = RPC
&SID = [这是什么?它从何而来?16个字符的大写字母数字,每个请求都保持相同]
&CI = 0
&AID = [这是什么?它从何而来?整数,从1开始,奇怪地增加到150然后298]
&TYPE = XMLHTTP
&zx = [这是什么?它从何而来?12个字符的小写字母数字,更改每个请求]
&t = 1时
检查所有实时/绑定响应,看看它们是如何变化的.数据是如何进入的?它看起来像是一些改变的JSON.我需要多少次连接才能获取数据?那里的活跃访客在哪里?这是一个样本数据转储:
19 [[151,["noop"]]] 388 [[152,["rt",[{"ot:0:0:4":{"timeUnit":"MINUTES","overTimeData":[{"值":[49,53,52,40,42,55,49,41,51,52,47,42,62,82,76,71,81,66,81,86,71,66,65, 65,55,51,53,73,71,81], "姓名": "合计"}]}, "OT:0:0:3":{ "TIMEUNIT": "秒", "overTimeData":[ { "值":[0,1,1,1,1,0,1,0,1,1,1,0,2,0,2,2,1,0,0,0,0,0, 2,1,1,2,1,2,0,5,1,0,2,1,1,1,2,0,2,1,0,5,1,1,2,0,0, 0,0,0,0,0,0,0,1,1,0,3,2,0],"名称":"总计"}]}}]]]] 388 [[153,["rt ",[{ "OT:0:0:4":{ …
ajax screen-scraping google-analytics google-analytics-api web-scraping
我正在使用Nokogiri和open-uri来抓取网页上标题标签的内容,但是在重音字符方面遇到了麻烦.处理这些问题的最佳方法是什么?这是我正在做的事情:
require 'open-uri'
require 'nokogiri'
doc = Nokogiri::HTML(open(link))
title = doc.at_css("title")
Run Code Online (Sandbox Code Playgroud)
此时,标题如下所示:
抹布\ 303\271
代替:
肉酱
我怎样才能让nokogiri返回正确的字符(例如在这种情况下为ù)?
这是一个示例网址:
http://www.epicurious.com/recipes/food/views/Tagliatelle-with-Duck-Ragu-242037
我正在寻找一个功能类似于Perl的WWW :: Mechanize的库,但是对于PHP.基本上,它应该允许我使用简单的语法提交HTTP GET和POST请求,然后解析生成的页面并以简单的格式返回所有表单及其字段,以及页面上的所有链接.
我知道CURL,但它有点过于简单,而且语法非常难看(大量的curl_foo($curl_handle, ...)陈述
澄清:
到目前为止,我想要比答案更高级的东西.例如,在Perl中,您可以执行以下操作:
# navigate to the main page
$mech->get( 'http://www.somesite.com/' );
# follow a link that contains the text 'download this'
$mech->follow_link( text_regex => qr/download this/i );
# submit a POST form, to log into the site
$mech->submit_form(
with_fields => {
username => 'mungo',
password => 'lost-and-alone',
}
);
# save the results as a file
$mech->save_content('somefile.zip');
Run Code Online (Sandbox Code Playgroud)
要使用HTTP_Client或wget或CURL做同样的事情会有很多工作,我必须手动解析页面以查找链接,找到表单URL,提取所有隐藏字段,等等.我要求PHP解决方案的原因是我没有使用Perl的经验,而且我可以用很多工作构建我需要的东西,但如果我能在PHP中完成上述操作会更快.
打开网页并截取屏幕截图.
只使用phantomjs:(这是一个简单的脚本,实际上它是在他们的文档中使用的示例脚本.http://phantomjs.org/screen-capture.html
var page = require('webpage').create();
page.open('http://github.com/', function() {
page.render('github.png');
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
问题是,对于一些网站(如github),足够有趣的是以某种方式检测并且不提供phantomjs并且没有任何东西被渲染.结果是github.png一个空白的白色png文件.
用说:"google.com"替换github,你会得到一个很好的(正确的)截图.
起初我认为这是一个Phantomjs问题所以我尝试通过Casperjs运行它:
casper.start('http://www.github.com/', function() {
this.captureSelector('github.png', 'body');
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
但我得到与Phantomjs相同的行为.
所以我认为这很可能是用户代理问题.如:Github嗅出Phantomjs并决定不显示页面.所以我设置用户代理如下,但仍然无法正常工作.
var page = require('webpage').create();
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36';
page.open('http://github.com/', function() {
page.render('github.png');
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
所以我试图解析页面,显然有些网站(再次像github)似乎没有发送任何网络.
使用casperjs我试图打印标题.对于google.com我回来了Google但是对于github.com我回来了bupkis.示例代码:
var casper = require('casper').create();
casper.start('http://github.com/', function() {
this.echo(this.getTitle());
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
与上述相同也在纯粹的幻影中产生相同的结果.
这可能是一个时间问题吗?github只是超级慢吗?我怀疑它,但无论如何都要测试..
var page = require('webpage').create();
page.open('http://github.com', function (status) {
/* irrelevant */ …Run Code Online (Sandbox Code Playgroud) screen-scraping ×10
python ×3
html ×2
unicode ×2
.net ×1
ajax ×1
automation ×1
c# ×1
casperjs ×1
java ×1
javascript ×1
mechanize ×1
nokogiri ×1
open-uri ×1
parsing ×1
phantomjs ×1
php ×1
ruby ×1
scraper ×1
scrapy ×1
security ×1
user-agent ×1
web-crawler ×1
web-scraping ×1
xpath ×1