相关疑难解决方法(0)

设置Scrapy代理中间件以在每个请求上轮换

这个问题必然有两种形式,因为我不知道解决方案的更好途径.

我正在抓取的网站经常将我踢到重定向的"用户阻止"页面,但频率(按请求/时间)似乎是随机的,并且它们似乎有一个黑名单阻止我正在使用的许多"开放"代理列表通过Proxymesh.所以...

  1. 当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,并且很高兴知道...)

  2. 什么是最有效的解决方案?

(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)

python proxy redirect http-proxy scrapy

10
推荐指数
1
解决办法
1万
查看次数

如何避免在从基于登录的站点抓取数据时被禁止?

我正在尝试创建一个脚本,使用它我可以解析网站中的几个字段而不会被阻止。我希望从中获取数据的站点需要凭据才能访问其内容。如果不是为了登录,我本可以使用代理轮换绕过速率限制。

当我从基于登录的站点抓取内容时,我试图找出任何方法来避免在从那里抓取数据时被该站点禁止。To be specific, my script currently can fetch content from that site flawlessly but my ip address gets banned along the way if I keep on scraping.

到目前为止,我已经写过(将以下站点地址视为占位符):

import requests
from bs4 import BeautifulSoup

url = "https://stackoverflow.com/users/login?ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f"

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
    req = s.get(url)

    payload = {
        "fkey": BeautifulSoup(req.text,"lxml").select_one("[name='fkey']")["value"],
        "email": "some email",
        "password": "some password",
    }
    
    res = s.post(url,data=payload)
    soup = BeautifulSoup(res.text,"lxml")
    for …
Run Code Online (Sandbox Code Playgroud)

python beautifulsoup web-scraping python-3.x python-requests

3
推荐指数
1
解决办法
566
查看次数