我想通过代码下载谷歌街景图像,我确实做到了,但我遇到了一些问题。我想使用多个位置的 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 应用程序使用从 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意思是删除上面示例中不必要的结尾以将所有内容作为一个指标进行处理?
我试图根据其类别刮黄页。所以我从文本文件加载类别并将其提供给 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) 我是网络抓取的新手,我试图创建一个抓取器,它可以查看播放列表链接并获取音乐和作者的列表。
但该网站一直拒绝我的连接,因为它认为我是机器人,所以我使用 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)
我试图从我试图抓取的网站上解决验证码问题
通常它的工作方式是,验证码位于表单内,我将验证码数据发送到解决验证码 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) 我正在开发一个爬虫,它可以浏览网站并在 Sidekiq 工作人员中解析网站的特定部分。想象一下当抓取工具访问一个包含 10 个我感兴趣的元素并且每个元素都在 Sidekiq 中排队的网站时的情况。目前,我将元素的源代码作为参数传递,稍后将在 Nokogiri 中加载。我的问题是 - 将一个巨大的字符串作为参数传递给 Sidekiq 工作人员是个好主意吗?字符串长度始终在 77,000-80,000 个字符之间,因此它确实很大。或者我应该将其存储在临时表中并在 Nokogiri 加载之前找到特定记录?
我正在尝试使用 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 获取实际数据,但现在获取电话号码、评分、评论不是免费的。所以我想从前端转义数据。
请帮我。
我目前正在尝试抓取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 证书,我需要保持应用程序打开)。提前谢谢了!
我写了一个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) 我目前正在尝试学习网络抓取并决定抓取一些不和谐的数据。代码如下:
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 ×8
web-scraping ×4
scrapy ×2
botdetect ×1
burp ×1
certificate ×1
csv ×1
discord ×1
django ×1
grafana ×1
javascript ×1
node.js ×1
nokogiri ×1
postgresql ×1
prometheus ×1
psycopg2 ×1
puppeteer ×1
python-3.x ×1
recaptcha ×1
ruby ×1
sidekiq ×1
ssl ×1