小编rob*_*txt的帖子

Python selenium多处理

我在python中编写了一个与selenium结合使用的脚本,以便从其着陆页中抓取不同帖子的链接,最后通过跟踪通向其内页的URL来获取每个帖子的标题.虽然我在这里解析的内容是静态内容,但我使用selenium来了解它在多处理中的工作原理.

但是,我的意图是使用多处理进行抓取.到目前为止,我知道selenium不支持多处理,但似乎我错了.

我的问题:当使用selenium进行多处理运行时,如何减少执行时间?

This is my try (it's a working one):

import requests
from urllib.parse import urljoin
from multiprocessing.pool import ThreadPool
from bs4 import BeautifulSoup
from selenium import webdriver

def get_links(link):
  res = requests.get(link)
  soup = BeautifulSoup(res.text,"lxml")
  titles = [urljoin(url,items.get("href")) for items in soup.select(".summary .question-hyperlink")]
  return titles

def get_title(url):
  chromeOptions = webdriver.ChromeOptions()
  chromeOptions.add_argument("--headless")
  driver = webdriver.Chrome(chrome_options=chromeOptions)
  driver.get(url)
  sauce = BeautifulSoup(driver.page_source,"lxml")
  item = sauce.select_one("h1 a").text
  print(item)

if __name__ == '__main__':
  url = "https://stackoverflow.com/questions/tagged/web-scraping"
  ThreadPool(5).map(get_title,get_links(url))
Run Code Online (Sandbox Code Playgroud)

python selenium multiprocessing web-scraping python-3.x

16
推荐指数
2
解决办法
3349
查看次数

无法使我的脚本异步运行

我已经在vba中编写了一个脚本,以从torrent网站中刮取不同内容movie names及其内容。尽管和出现在其登录页面中,但我还是创建了脚本来解析同一层(从其主页开始)深一层的脚本。为了更清楚,这是这样的一个页面我的意思的主页。我的脚本完美地解析了它们。但是,我的意图是执行异步请求。当前,脚本正在同步(以阻塞方式)完成其工作。genrenamegenre

一篇文章中,我得到了omegastripes谁创建的脚本的答案(which more or less performs like how multiprocessing works),该脚本本来可以工作asynchronously。因此,这就是我找到的主意,但无法在以下脚本中实现。

到目前为止我的尝试:

Sub GetInfo()
    Const URL = "https://yts.am/browse-movies"
    Dim Http As New ServerXMLHTTP60, Html As New HTMLDocument
    Dim post As HTMLDivElement, oName$, oGenre$, R&
    Dim I&, key As Variant, iDic As Object
    Set iDic = CreateObject("Scripting.Dictionary")

    With Http
        .Open "GET", URL, False
        .send
        Html.body.innerHTML = .responseText
    End …
Run Code Online (Sandbox Code Playgroud)

vba asynchronous web-scraping

15
推荐指数
2
解决办法
525
查看次数

无法将下载的文件存储在相关文件夹中

我在python中编写了一个与selenium结合使用的脚本,从网页上下载了一些文档文件(以.doc结尾).我不想使用requestsurllib模块下载文件的原因是因为我正在使用的网站没有连接到每个文件的任何真实URL.它们是javascript加密的.但是,我在我的脚本中选择了一个模仿相同的链接.

我的脚本此刻做了什么:

  1. 在桌面中创建主文件夹
  2. 使用要下载的文件的名称在主文件夹中创建子文件夹
  3. 下载文件启动单击其链接并将文件放在主文件夹中. (this is what I need rectified)

如何修改我的脚本以下载文件,启动单击其链接并将下载的文件放入相关文件夹中?

到目前为止,这是我的尝试:

import os
import time
from selenium import webdriver

link ='https://www.online-convert.com/file-format/doc' 

dirf = os.path.expanduser('~')
desk_location = dirf + r'\Desktop\file_folder'
if not os.path.exists(desk_location):os.mkdir(desk_location)

def download_files():
    driver.get(link)
    for item in driver.find_elements_by_css_selector("a[href$='.doc']")[:2]:
        filename = item.get_attribute("href").split("/")[-1]
        #creating new folder in accordance with filename to store the downloaded file in thier concerning folder
        folder_name = item.get_attribute("href").split("/")[-1].split(".")[0]
        #set the new location of the folders to be created
        new_location = os.path.join(desk_location,folder_name) …
Run Code Online (Sandbox Code Playgroud)

python selenium web-scraping python-3.x selenium-webdriver

9
推荐指数
1
解决办法
358
查看次数

在没有硬编码有效负载的情况下无法从一个部分中抓取所有书籍

我创建了一个脚本来Customers who bought this item also bought这些页面的section下抓取不同书籍的名称。单击右箭头按钮后,您可以找到所有相关书籍。我在脚本中使用了两个不同的书籍链接来查看脚本的行为。

我在 post 请求中使用的有效负载是硬编码的,用于product_links. 有效负载似乎在页面源中可用,但I can't find the right way to use it automatically. 当我使用另一个书籍链接时,payload 中有几个 id 可能不相同,因此硬性 payload 似乎不是一个好主意。

我试过:

import requests
from bs4 import BeautifulSoup

product_links = [
    'https://www.amazon.com/Essential-Keto-Diet-Beginners-2019/dp/1099697018/',
    'https://www.amazon.com/Keto-Cookbook-Beginners-Low-Carb-Homemade/dp/B08QFBMSFT/'
]

url = 'https://www.amazon.com/acp/p13n-desktop-carousel/funjjvdbohwkuezi/getCarouselItems'
payload = {"aCarouselOptions":"{\"ajax\":{\"id_list\":[\"{\\\"id\\\":\\\"B07NYZJX2L\\\"}\",\"{\\\"id\\\":\\\"1939754445\\\"}\",\"{\\\"id\\\":\\\"1792145454\\\"}\",\"{\\\"id\\\":\\\"1073560988\\\"}\",\"{\\\"id\\\":\\\"1119578922\\\"}\",\"{\\\"id\\\":\\\"B083K5RRSG\\\"}\",\"{\\\"id\\\":\\\"B07SPSXHZ8\\\"}\",\"{\\\"id\\\":\\\"B08GG2RL1D\\\"}\",\"{\\\"id\\\":\\\"1507212305\\\"}\",\"{\\\"id\\\":\\\"B08QFBMSFT\\\"}\",\"{\\\"id\\\":\\\"164152247X\\\"}\",\"{\\\"id\\\":\\\"1673455980\\\"}\",\"{\\\"id\\\":\\\"B084DD8WHP\\\"}\",\"{\\\"id\\\":\\\"1706342667\\\"}\",\"{\\\"id\\\":\\\"1628603135\\\"}\",\"{\\\"id\\\":\\\"B08NZV2Z4N\\\"}\",\"{\\\"id\\\":\\\"1942411294\\\"}\",\"{\\\"id\\\":\\\"1507209924\\\"}\",\"{\\\"id\\\":\\\"1641520434\\\"}\",\"{\\\"id\\\":\\\"B084Z7627Q\\\"}\",\"{\\\"id\\\":\\\"B08NRXFZ98\\\"}\",\"{\\\"id\\\":\\\"1623159326\\\"}\",\"{\\\"id\\\":\\\"B0827DHLR6\\\"}\",\"{\\\"id\\\":\\\"B08TL5W56Z\\\"}\",\"{\\\"id\\\":\\\"1941169171\\\"}\",\"{\\\"id\\\":\\\"1645670945\\\"}\",\"{\\\"id\\\":\\\"B08GLSSNKF\\\"}\",\"{\\\"id\\\":\\\"B08RR4RJHB\\\"}\",\"{\\\"id\\\":\\\"B07WRQ4CF4\\\"}\",\"{\\\"id\\\":\\\"B08Y49Z3V1\\\"}\",\"{\\\"id\\\":\\\"B08LNX32ZL\\\"}\",\"{\\\"id\\\":\\\"1250621097\\\"}\",\"{\\\"id\\\":\\\"1628600071\\\"}\",\"{\\\"id\\\":\\\"1646115511\\\"}\",\"{\\\"id\\\":\\\"1705799507\\\"}\",\"{\\\"id\\\":\\\"B08XZCM2P4\\\"}\",\"{\\\"id\\\":\\\"1072855267\\\"}\",\"{\\\"id\\\":\\\"B08VCMWPB9\\\"}\",\"{\\\"id\\\":\\\"1623159229\\\"}\",\"{\\\"id\\\":\\\"B08KH2J3FM\\\"}\",\"{\\\"id\\\":\\\"B08D54RBGP\\\"}\",\"{\\\"id\\\":\\\"1507212992\\\"}\",\"{\\\"id\\\":\\\"1635653894\\\"}\",\"{\\\"id\\\":\\\"B01MUB7BUV\\\"}\",\"{\\\"id\\\":\\\"0358120861\\\"}\",\"{\\\"id\\\":\\\"B08FV23D3F\\\"}\",\"{\\\"id\\\":\\\"B08FNMP9YY\\\"}\",\"{\\\"id\\\":\\\"1671590902\\\"}\",\"{\\\"id\\\":\\\"1641527692\\\"}\",\"{\\\"id\\\":\\\"1628603917\\\"}\",\"{\\\"id\\\":\\\"B07ZHPQBVZ\\\"}\",\"{\\\"id\\\":\\\"B08Y49Y63B\\\"}\",\"{\\\"id\\\":\\\"B08T2QRSN3\\\"}\",\"{\\\"id\\\":\\\"1729392164\\\"}\",\"{\\\"id\\\":\\\"B08T46R6XC\\\"}\",\"{\\\"id\\\":\\\"B08RRF5V1D\\\"}\",\"{\\\"id\\\":\\\"1592339727\\\"}\",\"{\\\"id\\\":\\\"1628602929\\\"}\",\"{\\\"id\\\":\\\"1984857088\\\"}\",\"{\\\"id\\\":\\\"0316529583\\\"}\",\"{\\\"id\\\":\\\"1641524820\\\"}\",\"{\\\"id\\\":\\\"1628602635\\\"}\",\"{\\\"id\\\":\\\"B00GRIR87M\\\"}\",\"{\\\"id\\\":\\\"B08FBHN5H7\\\"}\",\"{\\\"id\\\":\\\"B06ZYSS7HS\\\"}\"]},\"autoAdjustHeightFreescroll\":true,\"first_item_flush_left\":false,\"initThreshold\":100,\"loadingThresholdPixels\":100,\"name\":\"p13n-sc-shoveler_n1in5tlbg2h\",\"nextRequestSize\":6,\"set_size\":65}","faceoutspecs":"{}","faceoutkataname":"GeneralFaceout","individuals":"0","language":"en-US","linkparameters":"{\"pd_rd_w\":\"eouzj\",\"pf_rd_p\":\"45451e33-456f-46b5-8f06-aedad504c3d0\",\"pf_rd_r\":\"6Q3MPZHQQ2ESWZND1K8T\",\"pd_rd_r\":\"e5e43c03-d78d-41d3-9064-87af93f9856b\",\"pd_rd_wg\":\"PdhmI\"}","marketplaceid":"ATVPDKIKX0DER","name":"p13n-sc-shoveler_n1in5tlbg2h","offset":"6","reftagprefix":"pd_sim","aDisplayStrategy":"swap","aTransitionStrategy":"swap","aAjaxStrategy":"promise","ids":["{\"id\":\"B07SPSXHZ8\"}","{\"id\":\"B08GG2RL1D\"}","{\"id\":\"1507212305\"}","{\"id\":\"B08QFBMSFT\"}","{\"id\":\"164152247X\"}","{\"id\":\"1673455980\"}","{\"id\":\"B084DD8WHP\"}","{\"id\":\"1706342667\"}","{\"id\":\"1628603135\"}"],"indexes":[6,7,8,9,10,11,12,13,14]}

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'
    # for product_link in product_links:
    s.headers['x-amz-acp-params'] = "tok=0DV5j8DDJsH8JQfdVFxJFD3p6AZraMOZTik-kgzNi08;ts=1619674837835;rid=ER1GSMM13VTETPS90K43;d1=251;d2=0;tpm=CGHBD;ref=rtpb"
    res = s.post(url,json=payload) …
Run Code Online (Sandbox Code Playgroud)

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

8
推荐指数
1
解决办法
325
查看次数

放大后无法获取任何元素的屏幕截图

我正在尝试使用python与硒结合从网页中截取所需部分的屏幕截图。当我执行脚本时,确实会得到一个屏幕截图,但这并不是我打算让脚本抓取的。

我希望抓住Desired one下面显示的部分而不是Current output。要获得screenshot确切的显示方式Desired one,脚本必须单击该图像旁边的+按钮以使其更宽,以使图库中的点可见。

但是,当前方法仅获取该图像的部分部分的屏幕截图。而且,它也抓住了不需要的部分。

网页连结

我尝试过:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

link = 'https://www1.ticketmaster.com/celine-dion-courage-world-tour/event/0600567BFDB0AB48'

def start_script():
    options = webdriver.ChromeOptions()
    options.add_argument("--start-maximized")
    driver = webdriver.Chrome(options=options)
    return driver

def get_links(url):
    driver = start_script()
    driver.get(url)
    try:
        button = WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#landingPricingMessage button.pricing-landing__modal-btn")))
    except Exception: button = ""
    if button: button.click()

    try:
        zoom = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"button[class='zoomer__control--zoomin'] > svg[class='zoomin']")))
    except Exception: zoom …
Run Code Online (Sandbox Code Playgroud)

python selenium web-scraping python-3.x selenium-webdriver

7
推荐指数
1
解决办法
290
查看次数

无法使用请求从网页中获取所有链接

我正在尝试获取连接到此网页中每个图像的所有链接。

如果让 selenium 脚本向下滚动直到到达底部,我可以获得所有链接。我希望抓取的一个这样的链接就是这个

现在,我的目标是使用请求解析所有这些链接。我注意到我想要解析的链接是使用这样的B-uPwZsJtnB短代码构建的。

但是,我试图shortcode在该网页的页面源中找到的脚本标记中抓取那些不同的可用内容。600 shortcodes在那个页面周围有。我已经创建了可以解析只有第一个脚本70这样shortcode最终可以建成70个限定链接。

如何使用请求获取所有 600 个链接?

到目前为止,我已经尝试过:

import re
import json
import requests

base_link = 'https://www.instagram.com/p/{}/'
lead_url = 'https://www.instagram.com/explore/tags/baltimorepizza/'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
    req = s.get(lead_url)
    script_tag = re.findall(r"window\._sharedData[^{]+(.*?);",req.text)[0]
    for item in json.loads(script_tag)['entry_data']['TagPage']:
        tag_items = item['graphql']['hashtag']['edge_hashtag_to_media']['edges']
        for elem in tag_items:
            profile_link = base_link.format(elem['node']['shortcode'])
            print(profile_link)
Run Code Online (Sandbox Code Playgroud)

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

7
推荐指数
1
解决办法
323
查看次数

在有有效响应之前,无法逐个使用代理

我在python的scrapy中编写了一个脚本,通过get_proxies()方法使用新生成的代理之一来生成代理请求.我使用requests模块来获取代理,以便在脚本中重用它们.但是,问题是我的脚本选择使用的代理可能不是一个好的代理,所以有时它不会获取有效的响应.

在有有效响应之前,如何让我的脚本继续尝试不同的代理?

我的脚本到目前为止:

import scrapy
import random
import requests
from itertools import cycle
from bs4 import BeautifulSoup
from scrapy.http.request import Request
from scrapy.crawler import CrawlerProcess

class ProxySpider(scrapy.Spider):
    name = "sslproxies"
    check_url = "https://stackoverflow.com/questions/tagged/web-scraping"
    proxy_link = "https://www.sslproxies.org/"

    def start_requests(self):
        proxylist = self.get_proxies()
        random.shuffle(proxylist)
        proxy_ip_port = next(cycle(proxylist))
        print(proxy_ip_port)       #Checking out the proxy address
        request = scrapy.Request(self.check_url, callback=self.parse,errback=self.errback_httpbin,dont_filter=True)
        request.meta['proxy'] = "http://{}".format(proxy_ip_port)
        yield request

    def get_proxies(self):   
        response = requests.get(self.proxy_link)
        soup = BeautifulSoup(response.text,"lxml")
        proxy = [':'.join([item.select_one("td").text,item.select_one("td:nth-of-type(2)").text]) for item in soup.select("table.table tbody …
Run Code Online (Sandbox Code Playgroud)

python proxy scrapy web-scraping scrapy-spider

6
推荐指数
1
解决办法
551
查看次数

无法使我的脚本以正确的方式处理本地创建的服务器响应

我已经使用脚本在本地运行Selenium,以便可以利用我的Spider中的响应(来自Selenium)。

这是selenium在本地运行的Web服务:

from flask import Flask, request, make_response
from flask_restful import Resource, Api
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

app = Flask(__name__)
api = Api(app)

class Selenium(Resource):
    _driver = None

    @staticmethod
    def getDriver():
        if not Selenium._driver:
            chrome_options = Options()
            chrome_options.add_argument("--headless")

            Selenium._driver = webdriver.Chrome(options=chrome_options)
        return Selenium._driver

    @property
    def driver(self):
        return Selenium.getDriver()

    def get(self):
        url = str(request.args['url'])

        self.driver.get(url)

        return make_response(self.driver.page_source)

api.add_resource(Selenium, '/')

if __name__ == '__main__':
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

这是我的scrap脚蜘蛛,它利用该响应从网页中解析标题。

import scrapy
from urllib.parse import quote
from scrapy.crawler import CrawlerProcess

class StackSpider(scrapy.Spider): …
Run Code Online (Sandbox Code Playgroud)

python scrapy web-scraping flask python-3.x

6
推荐指数
1
解决办法
323
查看次数

脚本从众多内容中获取更少的内容

我正在尝试从网页中获得不同的大学名称及其排名。我尝试过的脚本可以解析前几个名称及其排名。

但是,该页面中有233个名称及其排名,但是只有当该页面向下滚动时,它们才可见。问题是当页面向下滚动时,URL仍然相同,因此我无法创建任何处理分页的逻辑。

网站地址

我不希望硒,这就是我创建此帖子以使用请求解决相同问题的原因。

到目前为止,我已经写过(抢了前几条记录):

import requests
from bs4 import BeautifulSoup

url = 'https://www.usnews.com/best-colleges/rankings/national-liberal-arts-colleges'

r = requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
soup = BeautifulSoup(r.text,"lxml")
for item in soup.select("[id^='school-']"):
    name = item.select_one("[class^='DetailCardColleges__StyledAnchor']").text
    rank = item.select_one("[class^='ranklist-ranked-item'] > strong").text
    print(name,rank)
Run Code Online (Sandbox Code Playgroud)

如何使用请求解析所有名称及其排名?

python web-scraping python-3.x

6
推荐指数
1
解决办法
194
查看次数

为什么我不能使用正则表达式从某些字符串中找出一些ID?

我正在尝试ID从某些字符串中找出一些。我想从每个字符串中抓取的部分在bd-和之间?。后者并不总是存在的,所以我想做出这个信号吗?可选的。我知道我可以使用字符串操作来实现相同的目的,但是我希望使用正则表达式来实现相同的目的。

我尝试过:

import re

content = """
id-HTRY098WE
id-KNGT371WE?witkl
id-ZXV555NQE?phnu
eh-VCBG075LK
"""
for item in re.findall(r'id-(.*)\??',content):
    print(item)
Run Code Online (Sandbox Code Playgroud)

输出它产生:

HTRY098WE
KNGT371WE?witkl
ZXV555NQE?phnu
Run Code Online (Sandbox Code Playgroud)

预期产量:

HTRY098WE
KNGT371WE
ZXV555NQE
Run Code Online (Sandbox Code Playgroud)

如何ID从某些字符串中刮掉?

python regex python-3.x

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