我的代码中有类似的东西:
df2 = df[df['A'].str.contains("Hello|World")]
但是,我想要所有不包含Hello或World的行.我如何最有效地扭转这一局面?
这个问题必然有两种形式,因为我不知道解决方案的更好途径.
我正在抓取的网站经常将我踢到重定向的"用户阻止"页面,但频率(按请求/时间)似乎是随机的,并且它们似乎有一个黑名单阻止我正在使用的许多"开放"代理列表通过Proxymesh.所以...
当Scrapy收到其请求的"重定向"(例如DEBUG: Redirecting (302) to (GET http://.../you_got_blocked.aspx) from (GET http://.../page-544.htm))时,它是否继续尝试访问page-544.htm,还是继续到page-545.htm并永远丢失在-544.htm页面上?如果它"忘记"(或将其视为已访问),是否有办法告诉它继续重试该页面?(如果它自然地这样做,那么yay,并且很高兴知道...)
什么是最有效的解决方案?
(a)我目前正在做的事情:通过http_proxy环境变量使用proxymesh旋转代理,它似乎经常旋转代理,至少可以定期地通过目标站点的重定向.(下行:开放代理的ping速度很慢,只有这么多,proxymesh最终会开始收取我每次演出10次演出的费用,我只需要它们在重定向时旋转,我不知道经常或在什么触发它们旋转,以及上面:我不知道我被重定向的页面是否被Scrapy重新排队...)(如果Proxymesh在每个请求上轮换,那么我可以付出合理的代价费用).
(b)使用中间件在每次重定向上重新选择新代理是否有意义(并且很简单)?每一个请求怎么样?通过TOR或Proxifier这样的东西会更有意义吗?如果这是相对简单的,我将如何设置它?我在一些地方读过这样的东西,但大多数都是过时的链接断开或Scated命令已弃用.
作为参考,我确实为Proxy Mesh设置了中间件(是的,我正在使用http_proxy环境变量,但是当我遇到麻烦时,我是冗余的粉丝).所以这就是我目前所拥有的,如果重要的话:
class ProxyMiddleware(object):
def process_request(self, request, spider):
request.meta['proxy'] = "http://open.proxymesh.com:[port number]"
proxy_user_pass = "username:password"
encoded_user_pass = base64.encodestring(proxy_user_pass)
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
Run Code Online (Sandbox Code Playgroud) 在使用scrapy浏览网站时,我会在大约1/5的时间内被重定向到用户阻止的页面.我输了,我重定向的页面从当这种情况发生.我不知道在中间件中使用哪个中间件或使用什么设置,但我想要这个:
DEBUG: Redirecting (302) to (GET http://domain.com/foo.aspx) from (GET http://domain.com/bar.htm)
不要掉落bar.htm.当刮刀完成时,我最终没有来自bar.htm的数据,但我正在旋转代理,所以如果它再次尝试bar.htm(可能再多次),我应该得到它.如何设置尝试次数?
如果它很重要,我只允许爬虫使用一个非常具体的起始网址然后只按照"下一页"链接,所以它应该按顺序通过少量页面 - 因此我需要它重试,例如,第34页,或稍后再回来.Scrapy文档说默认情况下应该重试20次,但我根本没有看到它重试.此外,如果它有帮助:所有重定向都转到同一页面(一个"离开"页面,上面的foo.com) - 有没有办法告诉Scrapy该特定页面"不计数",如果它被重定向到那里,继续重试?我在下载程序中间件中看到了一些引用列表中特定http代码的内容 - 我能以某种方式向"始终保持尝试此"列表中添加302吗?
我正在通过Scrapy通过ASP.NET编程爬行一些目录.
要爬网的页面编码如下:
javascript:__doPostBack('ctl00$MainContent$List','Page$X')
其中X是介于1和180之间的int.MainContent参数始终相同.我不知道如何爬进这些.我喜欢添加一些简单如系统性红斑狼疮规则allow=('Page$')或attrs='__doPostBack',但我的猜测是,我必须以拉从JavaScript中的信息棘手的"链接".
如果更容易从javascript代码"取消屏蔽"每个绝对链接并将其保存到csv,那么使用该csv将请求加载到新的scraper中,这也没关系.
我有 '00:00:00.0000000' 形式的对象,我只想从中提取一个浮点数。从import time我至今有这样的:
>>> reformat = time.strptime('00:05:36.0100000', '%H:%M:%S.%f0')
>>> print reformat
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=5, tm_sec=36, tm_wday=0, tm_yday=1, tm_isdst=-1)
Run Code Online (Sandbox Code Playgroud)
看起来这应该跟随类似time.getminutes(reformat)或reformat.minutes()和瞧的东西。我找不到这样的操作。
具体来说,我正在尝试做一些与这个问题非常相似的事情(有同样的问题):FB Ads API (#17) User request limit connected
但是,我正在尝试在 python 中执行此操作(并且自 15 年以来 API 发生了很大变化)。这是我的代码(它把我踢出去,即使有睡眠时间) - 我想知道是否有人可以帮助我调用具有类似信息的数组,以减少我的总调用次数。
my_account = AdAccount(ad_account_id)
camps = my_account.get_campaigns(fields=[Campaign.Field.name])
for campaign in camps[0:100]:
time.sleep(5)
print campaign[Campaign.Field.name]
adsets = campaign.get_ad_sets([AdSet.Field.name, AdSet.Field.status])
for adset in adsets:
print '\t', adset[AdSet.Field.name]
for stat in adset.get_insights(fields=[
'impressions',
'clicks',
'spend',
'unique_clicks',
]):
for statfield in stat:
print "\t\t%s:\t%s" % (statfield, stat[statfield])
Run Code Online (Sandbox Code Playgroud)
更一般地说,我打算如何在此限制范围内为我的需求(大规模更改)编码?实际上,我想编写一个代码来检查和更改我公司每个广告组中的一些选项(例如“扩展兴趣...”从关闭到开启)。我们有数百个广告集,API 文档说更改消耗的调用次数是创建调用的 10-100 倍(我两个都没有遇到,只是阅读!)。这是否只是在每次更改之间让代码休眠 60 秒的问题?他们不太清楚你在一个时间段内接到多少电话,或者检查这些电话的时间段有多宽。例如,如果是每日限制,那么睡眠将无法帮助我更改 1200 个广告组的选项。
我确实看到了有关升级的文档(https://developers.facebook.com/docs/marketing-api/access),但是在审核过程中,所有内容都基于公共(面向客户、多用户)应用程序。我想要做的就是能够从仅限桌面开发的内部脚本进行调用以进行批量更改。我找错地方了吗?
python ×6
python-2.7 ×3
scrapy ×3
redirect ×2
asp.net ×1
csv ×1
datetime ×1
facebook ×1
http-proxy ×1
javascript ×1
pandas ×1
proxy ×1
string ×1
web-scraping ×1