我有一个关于ThreadPoolExecutorvsThread类本身性能的问题,在我看来,我缺乏一些基本的理解。
我有两个功能的网络爬虫。首先解析网站主页的每个图像的链接,然后从解析的链接加载图像:
import threading
import urllib.request
from bs4 import BeautifulSoup as bs
import os
from concurrent.futures import ThreadPoolExecutor
path = r'C:\Users\MyDocuments\Pythom\Networking\bbc_images_scraper_test'
url = 'https://www.bbc.co.uk'
# Function to parse link anchors for images
def img_links_parser(url, links_list):
res = urllib.request.urlopen(url)
soup = bs(res,'lxml')
content = soup.findAll('div',{'class':'top-story__image'})
for i in content:
try:
link = i.attrs['style']
# Pulling the anchor from parentheses
link = link[link.find('(')+1 : link.find(')')]
# Putting the anchor in the list of links
links_list.append(link)
except: …Run Code Online (Sandbox Code Playgroud) 我想通过代码下载谷歌街景图像,我确实做到了,但我遇到了一些问题。我想使用多个位置的 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) 我正在尝试运行 Selenium 从我公司的内部网站上抓取信息。我一直遇到以下错误:
驱动程序<- rsDriver(浏览器=c(“chrome”)
检查 Selenium 服务器版本:BEGIN:PREDOWNLOAD open.connection(con,“rb”)中的错误:无法连接到 www.googleapis.com端口 443:超时
我已经尝试过这篇文章中的解决方案,但它在代理后面的 RSelenium不起作用
我也在论坛上搜索过,因为过去有很多人遇到过类似的问题,但与 R 相关的人并不多。其他职位涉及的职能现已不复存在。还有其他办法吗?
我正在尝试网络抓取 http 网站,当我尝试阅读该网站时出现以下错误。
HTTPSConnectionPool(host='proxyvipecc.nb.xxxx.com', port=83): Max retries exceeded with url: http://campanulaceae.myspecies.info/ (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden',)))
Run Code Online (Sandbox Code Playgroud)
下面是我在类似网站上编写的代码。我尝试使用 urllib 和 user-agent 但仍然存在同样的问题。
url = "http://campanulaceae.myspecies.info/"
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'})
soup = BeautifulSoup(response.text, 'html.parser')
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决这个问题。提前致谢
我试图根据其类别刮黄页。所以我从文本文件加载类别并将其提供给 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)
因此,我的应用程序 (spring-boot) 运行速度非常慢,因为它使用 Selenium 来抓取数据、处理数据并显示在主页中。我遇到了多线程,我认为它可以对我的应用程序有用以使其运行得更快,但是教程似乎显示在带有 main.js 的普通 java 应用程序的设置中。如何在我的控制器中多线程这个单一方法?
get.. 的方法都是 selenium 方法。我希望同时运行这 4 行代码
@Autowired
private WebScrape webscrape;
@RequestMapping(value = "/")
public String printTable(ModelMap model) {
model.addAttribute("alldata", webscrape.getAllData());
model.addAttribute("worldCases", webscrape.getWorlValues().get(0));
model.addAttribute("worldDeaths", webscrape.getWorlValues().get(1));
model.addAttribute("worldPop", webscrape.getWorlValues().get(2));
return "index";
}
Run Code Online (Sandbox Code Playgroud) 下面是我逐行编写的代码(大约有900 页,每行 10 行和 5 个数据)有什么办法可以使它更快。目前将数据导出到 csv需要80 分钟。有什么方法可以对页面进行并行请求并提高此代码的效率。
import requests
from urllib3.exceptions import InsecureRequestWarning
import csv
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from bs4 import BeautifulSoup as bs
f = csv.writer(open('GEM.csv', 'w', newline=''))
f.writerow(['Bidnumber', 'Items', 'Quantitiy', 'Department', 'Enddate'])
def scrap_bid_data():
page_no = 1
while page_no < 910:
print('Hold on creating URL to fetch data...')
url = 'https://bidplus.gem.gov.in/bidlists?bidlists&page_no=' + str(page_no)
print('URL created: ' + url)
scraped_data = requests.get(url, verify=False)
soup_data = bs(scraped_data.text, 'lxml')
extracted_data = soup_data.find('div', {'id': 'pagi_content'})
if len(extracted_data) == 0: …Run Code Online (Sandbox Code Playgroud) python multithreading asynchronous threadpool python-multithreading
我正在尝试使用预定义数量的工作人员进行一些网络抓取,作为学习。
我使用Noneas 作为哨兵来打破 while 循环并停止工作人员。
每个worker的速度各不相同,在最后一个url传递gather_search_links到获取链接之前,所有worker都被关闭。
我尝试使用asyncio.Queue,但与 deque 相比,我的控制力更小。
async def gather_search_links(html_sources, detail_urls):
while True:
if not html_sources:
await asyncio.sleep(0)
continue
data = html_sources.pop()
if data is None:
html_sources.appendleft(None)
break
data = BeautifulSoup(data, "html.parser")
result = data.find_all("div", {"data-component": "search-result"})
for record in result:
atag = record.h2.a
url = f'{domain_url}{atag.get("href")}'
detail_urls.appendleft(url)
print("apended data", len(detail_urls))
await asyncio.sleep(0)
async def get_page_source(urls, html_sources):
client = httpx.AsyncClient()
while True:
if not urls:
await asyncio.sleep(0)
continue
url = urls.pop()
print("url", …Run Code Online (Sandbox Code Playgroud) 这是我第一次在这里发布问题,如果缺少一些数据,请抱歉。
我正在尝试进行一些网络抓取以获取表格的一些信息。该页面仅响应index.php,当我使用搜索表单时,它会使用一些formData 向index.php?go=le 发送POST。为了避免 CORS 问题,我使用在本地主机中运行的我自己的 API 来发布帖子。我将前端指向我的 API,然后从本地主机获得响应。那里没问题。
当我尝试向我的 API 发出第二个请求时,我的问题出现了。第一个 GET 工作正常,但在响应之后它一直失败。
当我重新启动服务器时,它会再次工作,但只工作一次。
这是我的 API 代码。我用来nodemon server.js启动我的服务器。
服务器.js
const express = require("express");
const axios = require("axios");
const scrape = require("scrape-it");
const FormData = require("form-data")
const cors = require("cors")
const app = express();
const PORT = process.env.PORT || 5000;
app.use(cors())
const config = {
headers: {
'Content-type': 'multipart/form-data'
},
}
app.get("/get-projects", async (req,res) => {
const testJSON = await axios.post(baseURL +"/index.php?go=le",formData,config)
.then(res => {
console.log("Post …Run Code Online (Sandbox Code Playgroud) python ×5
web-scraping ×3
python-3.x ×2
threadpool ×2
async-await ×1
asynchronous ×1
axios ×1
botdetect ×1
csv ×1
econnreset ×1
express ×1
http-error ×1
java ×1
node.js ×1
r ×1
scrapy ×1
spring ×1
spring-boot ×1