小编bar*_*rny的帖子

抓取多个位置的谷歌街景图像

我想通过代码下载谷歌街景图像,我确实做到了,但我遇到了一些问题。我想使用多个位置的 180 度摄像头下载单个街景图像。

为此,我在 python 中使用了 pypi 的 google-streetview 1.2.4 库。代码如下。 https://pypi.org/project/google-streetview/ https://rrwen.github.io/google_streetview/#

# Import google_streetview for the api and helper module
import google_streetview.api
import google_streetview.helpers

# Create a dictionary with multiple parameters separated by ;
apiargs = {
  'location': '23.87,90.3939;23.87,90.3944;23.87,90.3951;23.87,90.3959',
  'size': '640x300',
  'heading': '0;90;180',

  'pitch': '0;0;0;0',
  'key': 'google_dev_key'
}

# Get a list of all possible queries from multiple parameters
api_list = google_streetview.helpers.api_list(apiargs)

# Create a results object for all possible queries
results = google_streetview.api.results(api_list)

# Preview results
results.preview() …
Run Code Online (Sandbox Code Playgroud)

python web-scraping google-street-view

5
推荐指数
1
解决办法
1732
查看次数

Prometheus - 具有不同标签的相同指标在抓取之前被覆盖

我使用自定义 python 应用程序使用从 Kafka 到 Prometheus 的各种计量指标。需要在或多或少相同的时间(毫秒)内消耗指标。我能够成功地从下面的示例中仅抓取最后一个指标,因为前三个指标会立即被覆盖。

my_metric{labelA = "aaa", labelB = "111"} 8
my_metric{labelA = "aaa", labelB = "222"} 12
my_metric{labelA = "bbb", labelB = "111"} 7
**my_metric{labelA = "bbb", labelB = "222"} 15**
Run Code Online (Sandbox Code Playgroud)

我可以通过设置唯一的指标名称来获取所有四个指标,例如

my_metric_aaa_111{labelA = "aaa", labelB = "111"} 8
Run Code Online (Sandbox Code Playgroud)

但这似乎不是最佳实践,而且以后在 Grafana 中使用此类指标通常非常困难。

我还可以连续推送要抓取的指标并降低 Prometheus 配置中的抓取间隔,但这违背了解决方案的整体理念。

除了我完全不知道的建议之外 - 是否可以为 Prometheus 保留相同的度量标准,仅在标签值不同的情况下进行抓取?我发现的唯一讨论是在这里没有答案: https: //github.com/prometheus/pushgateway/issues/65

如果上述不可能,我可以稍后在 Prometheus/Grafana 中以某种方式合并/加入/组合指标名称,以便能够根据它们的标签使用它们吗?_aaa_111意思是删除上面示例中不必要的结尾以将所有内容作为一个指标进行处理?

python grafana prometheus

5
推荐指数
1
解决办法
8421
查看次数

在scrapy中为每个类别制作单独的输出文件

我试图根据其类别黄页。所以我从文本文件加载类别并将其提供给 start_urls。我在这里面临的问题是为每个类别分别保存输出。以下是我尝试实现的代码:

CATEGORIES = []
with open('Catergories.txt', 'r') as f:
    data = f.readlines()

    for category in data:
        CATEGORIES.append(category.strip())
Run Code Online (Sandbox Code Playgroud)

打开 settings.py 中的文件并制作一个列表以在蜘蛛中访问。

蜘蛛:

# -*- coding: utf-8 -*-
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from ..items import YellowItem
from scrapy.utils.project import get_project_settings

settings = get_project_settings()


class YpSpider(CrawlSpider):
    categories = settings.get('CATEGORIES')

    name = 'yp'
    allowed_domains = ['yellowpages.com']

    start_urls = ['https://www.yellowpages.com/search?search_terms={0}&geo_location_terms=New%20York'
                      '%2C '
                      '%20NY'.format(*categories)]
    rules = (

        Rule(LinkExtractor(restrict_xpaths='//a[@class="business-name"]', allow=''), callback='parse_item',
             follow=True),

        Rule(LinkExtractor(restrict_xpaths='//a[@class="next ajax-page"]', allow=''),
             follow=True),
    )

    def parse_item(self, …
Run Code Online (Sandbox Code Playgroud)

python csv scrapy export-to-csv

5
推荐指数
1
解决办法
270
查看次数

如何使用 python 绕过机器人检测并抓取网站

问题

我是网络抓取的新手,我试图创建一个抓取器,它可以查看播放列表链接并获取音乐和作者的列表。

但该网站一直拒绝我的连接,因为它认为我是机器人,所以我使用 UserAgent 创建一个假的 useragent 字符串来尝试绕过过滤器。

有点效果吗?但问题是,当你通过浏览器访问网站时,你可以看到播放列表的内容,但是当你尝试用请求提取html代码时,播放列表的内容只是一个很大的空白。

也许我必须等待页面加载?或者有更强大的机器人过滤器?

我的代码

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent

ua = UserAgent()

melon_site="http://kko.to/IU8zwNmjM"

headers = {'User-Agent' : ua.random}
result = requests.get(melon_site, headers = headers)


print(result.status_code)
src = result.content
soup = BeautifulSoup(src,'html.parser')
print(soup)

Run Code Online (Sandbox Code Playgroud)

网站链接

播放列表链接

使用请求时得到的 html

html 播放列表应该有空白

python beautifulsoup web-scraping python-requests botdetect

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

解决没有表单提交/按钮单击的验证码(使用回调)

我试图从我试图抓取的网站上解决验证码问题

通常它的工作方式是,验证码位于表单内,我将验证码数据发送到解决验证码 api(我使用 DBC),它们返回一个令牌

我将令牌放入验证码输入中(#g-recaptcha-response),即使当我提交表单时绿色支票没有出现,它也会被接受

但是当验证码以另一种方式解决时,该网站会自动显示我想要抓取的信息,当验证码的绿色勾号出现时,页面会更新新信息

所以我的问题是,当我将令牌放入验证码输入中时,是否有任何方法可以在不提交表单的情况下触发验证码已解决事件(或者当绿色检查出现时发生的任何情况。我猜测是某种回调)?

编辑 :

通过探索 recaptcha 配置探索我发现了这个

___grecaptcha_cfg.clients[0].L.L.callback
Run Code Online (Sandbox Code Playgroud)

这指向这一点

function verifyCallback(e)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何调用它

async function init_puppeteer() {

    const global_browser = await puppeteer.launch({headless: false     , slowMo : 10 ,  args: ['--no-sandbox', '--disable-setuid-sandbox' , ]});
    const page = await global_browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
    await page.setViewport({width: 1200, height: 1500});

    try {


        await page.goto('https://example.com', {timeout: 60000})
            .catch(function (error) {
                throw new Error('TimeoutBrows');
            });

        await page.waitForSelector('input[name="url"]');
        await page.type('input[name="url"]', …
Run Code Online (Sandbox Code Playgroud)

javascript recaptcha node.js puppeteer

5
推荐指数
1
解决办法
3761
查看次数

将一个巨大的字符串作为参数传递给 Sidekiq 工作人员是个好主意吗?

我正在开发一个爬虫,它可以浏览网站并在 Sidekiq 工作人员中解析网站的特定部分。想象一下当抓取工具访问一个包含 10 个我感兴趣的元素并且每个元素都在 Sidekiq 中排队的网站时的情况。目前,我将元素的源代码作为参数传递,稍后将在 Nokogiri 中加载。我的问题是 - 将一个巨大的字符串作为参数传递给 Sidekiq 工作人员是个好主意吗?字符串长度始终在 77,000-80,000 个字符之间,因此它确实很大。或者我应该将其存储在临时表中并在 Nokogiri 加载之前找到特定记录?

ruby ruby-on-rails nokogiri sidekiq

4
推荐指数
1
解决办法
1483
查看次数

如何使用python为所有数据抓取谷歌地图

我正在尝试使用 python 从谷歌地图中抓取某个地方的标题、电话号码、网站、地址、评级、评论数量。例如,Pike's Landing 餐厅(请参阅下面的谷歌地图 URL)需要所有信息。我想在python中拉那些。

网址:https : //www.google.com/maps?cid=15423079754231040967&hl=en

我在检查时可以看到 HTML 代码,但是当我使用漂亮的汤来抓取所有代码时,所有代码都被转换了。从堆栈溢出中,我找到了唯一审查次数的解决方案,如下代码,

import re
import requests
from ast import literal_eval

urls = [
'https://www.google.com/maps?cid=15423079754231040967&hl=en',
'https://www.google.com/maps?cid=16168151796978303235&hl=en']

for url in urls:
    for g in re.findall(r'\[\\"http.*?\d+ reviews?.*?]', requests.get(url).text):
        data = literal_eval(g.replace('null', 'None').replace('\\"', '"'))
        print(bytes(data[0], 'utf-8').decode('unicode_escape'))
        print(data[1])
Run Code Online (Sandbox Code Playgroud)

但我需要所有数据。我可以使用 Google Maps API 获取实际数据,但现在获取电话号码、评分、评论不是免费的。所以我想从前端转义数据。

请帮我。

python django web-scraping

4
推荐指数
1
解决办法
9912
查看次数

使用 BurpSuite 时,Python 请求 https:代码 403,但没有代码 200

我目前正在尝试抓取retailmenot.com,这就是我的代码到目前为止的样子:

import requests
from collections import OrderedDict

s = requests.session()

s.headers = OrderedDict()
s.headers["Connection"] = "close"
s.headers["Upgrade-Insecure-Requests"] = "1"
s.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
s.headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
s.headers["Sec-Fetch-Site"] = "none"
s.headers["Sec-Fetch-Mode"] = "navigate"
s.headers["Sec-Fetch-Dest"] = "document"
s.headers["Accept-Encoding"] = "gzip, deflate"
s.headers["Accept-Language"] = "en-GB,en-US;q=0.9,en;q=0.8"

s.get("https://www.retailmenot.com/sitemap/A")
Run Code Online (Sandbox Code Playgroud)

当我使用此代码时,我会立即重定向到 CloudFlare 页面。也就是说,每当我通过 burpsuite 传递流量时,用以下代码替换代码的最后一行:

s.get("https://www.retailmenot.com/sitemap/A", proxies = {"https":"https://127.0.0.1:8080"}, verify ="/Users/Downloads/cacert (1).pem")
Run Code Online (Sandbox Code Playgroud)

我直接进入网站。我觉得这有点奇怪,想知道是否有人可以向我解释为什么会发生这种情况,以及是否有办法通过使用一些不同的证书来获得类似的结果(为了使用 BurpSuite 证书,我需要保持应用程序打开)。提前谢谢了!

python ssl certificate python-requests burp

4
推荐指数
1
解决办法
2792
查看次数

psycopg2.errors.InFailedSqlTransaction:当前事务被中止,命令被忽略,直到事务块结束

我写了一个scrapy程序来从一个站点抓取数据,如果我抓取到一个json文件或csv文件,这个程序会成功抓取,当我尝试抓取我的postgres数据库时出现问题,下图显示了我收到的错误, 如何修复错误:

在此处输入图片说明

def process_item(self, item, spider):
    """Save deals in the database.
    This method is called for every item pipeline component.
    """
    self.cur.execute("insert into Deals (Name,Deal_Url,Image_Url,Old_Price,Special_Price,Final_Price) values(%s,%s,%s,%s,%s,%s)",(item['Name'],item['Product_URL'],item['Image_URL'],item['Old_Price'],item['Special_Price'],item['Final_Price']))
    self.connection.commit()
    return item
Run Code Online (Sandbox Code Playgroud)

python postgresql psycopg2 scrapy python-3.x

4
推荐指数
1
解决办法
3412
查看次数

使用python在discord上抓取数据

我目前正在尝试学习网络抓取并决定抓取一些不和谐的数据。代码如下:

import requests
import json

def retrieve_messages(channelid):
    num=0
    headers = {
        'authorization': 'here we enter the authorization code'
    }
    r = requests.get(
        f'https://discord.com/api/v9/channels/{channelid}/messages?limit=100',headers=headers
        )
    jsonn = json.loads(r.text)
    for value in jsonn:
        print(value['content'], '\n')
        num=num+1
    print('number of messages we collected is',num)

retrieve_messages('server id goes here')
Run Code Online (Sandbox Code Playgroud)

问题:当我尝试更改此处的限制时,messages?limit=100显然它只接受 0 到 100 之间的数字,这意味着我可以获得的最大消息数是 100。例如,我尝试将此数字更改为 900,以抓取更多消息。但后来我得到了错误TypeError: string indices must be integers

关于如何获取频道中的所有消息有什么想法吗?

非常感谢您的阅读!

python web-scraping discord

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