小编MIT*_*THU的帖子

无法让我的脚本向右滑动按钮

我已经用python与硒结合编写了脚本来登录网站。关键是我的脚本有时会成功登录,但大多数情况下会遇到一个滑块,该滑块旨在向右滑动并向右滑动。

如何让我的脚本将该按钮向右滑动?

我尝试过:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def sign_in():
    driver.get("https://login.aliexpress.com/")
    wait.until(EC.frame_to_be_available_and_switch_to_it(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#alibaba-login-box")))))
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input#fm-login-id"))).send_keys("someEmail")
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input#fm-login-password"))).send_keys("somePassword")
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "button[class$='password-login']"))).click()

    #the following line is for handling the slider but it doesn't do anything

    item = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".nc_wrapper .btn_slide")))
    ActionChains(driver).move_to_element(item).perform()

if __name__ == '__main__':
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver,10)
    sign_in()
Run Code Online (Sandbox Code Playgroud)

连接到该滑块的HTML元素:

<div id="nc_1_n1t" class="nc_scale"> …
Run Code Online (Sandbox Code Playgroud)

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

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

无法阅读在线提供的 pdf 文件的某个页面的内容

我已经使用PyMuPDF库在本地解析 pdf 文件的任何特定页面的内容,并发现它可以工作。但是,当我在解析在线提供的 pdf 文件的任何特定页面的内容时尝试应用相同的逻辑时,我遇到了错误。

我使用以下脚本(本地 pdf)获得了成功:

import fitz

path = r'C:\Users\WCS\Desktop\pymupdf\Regular Expressions Cookbook.pdf'

doc = fitz.open(path)
page1 = doc.loadPage(5)
page1text = page1.getText("text")
print(page1text)
Run Code Online (Sandbox Code Playgroud)

下面的脚本引发错误(在线提供的pdf):

import fitz
import requests

URL = 'https://buildmedia.readthedocs.org/media/pdf/pdfminer-docs/latest/pdfminer-docs.pdf'

res = requests.get(URL)
doc = fitz.open(res.content)
page1 = doc.loadPage(5)
page1text = page1.getText("text")
print(page1text)
Run Code Online (Sandbox Code Playgroud)

脚本遇到的错误:

Traceback (most recent call last):
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\general_demo.py", line 8, in <module>
    doc = fitz.open(res.content)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\fitz\fitz.py", line 2010, in __init__
    _fitz.Document_swiginit(self, _fitz.new_Document(filename, stream, filetype, rect, width, height, fontsize))
RuntimeError: cannot open b'%PDF-1.5\n%\xd0\xd4\xc5\xd8\n1 …
Run Code Online (Sandbox Code Playgroud)

python pdf web-scraping python-3.x pymupdf

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

使用 puppeteer 单击不同链接时遇到问题

我已经使用 puppeteer 在节点中编写了小脚本,以从网站的登陆页面循环执行不同帖子的链接的点击。

我的脚本中使用的站点链接是一个占位符。而且,它们不是动态的。所以,傀儡师可能有点过分了。然而,我的目的是学习点击的逻辑。

当我执行第一个脚本时,它单击一次并在退出源时抛出以下错误。

const puppeteer = require("puppeteer");

(async () => {
    const browser = await puppeteer.launch({headless:false});
    const [page] = await browser.pages();
    await page.goto("/sf/ask/tagged/web-scraping/",{waitUntil:'networkidle2'});
    await page.waitFor(".summary");
    const sections = await page.$$(".summary");

    for (const section of sections) {
        await section.$eval(".question-hyperlink", el => el.click())
    }

    await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

上述脚本遇到的错误:

(node:9944) UnhandledPromiseRejectionWarning: Error: Execution context was destroyed, most likely because of a navigation.
Run Code Online (Sandbox Code Playgroud)

当我执行以下命令时,脚本假装单击一次(实际上并非如此)并遇到与之前相同的错误。

const puppeteer = require("puppeteer");

(async () => {
    const browser = await puppeteer.launch({headless:false});
    const [page] = await …
Run Code Online (Sandbox Code Playgroud)

node.js web-scraping puppeteer

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

无法使用请求从 zillow 中抓取自定义属性链接

我正在尝试解析当我从 zillow 中选择两个下拉列表时填充的不同属性链接。选择完选项后,我可以在开发工具中看到 json 格式的结果。但是,当我使用下面的脚本执行相同操作时,我收到一些奇怪的文本。

手动操作:

  1. 导航到该网站
  2. 从第一个下拉列表中选择选项
  3. 从第二个下拉列表中选择选项

这就是我尝试自动化的方式:

import json
import requests
from pprint import pprint

link = 'https://www.zillow.com/search/GetSearchPageState.htm?'

params = {
    'searchQueryState': {"pagination":{},"usersSearchTerm":"Vista, CA","mapBounds":{"west":-117.44051346728516,"east":-116.99488053271484,"south":33.126944633035116,"north":33.27919773006566},"regionSelection":[{"regionId":41517,"regionType":6}],"isMapVisible":True,"filterState":{"doz":{"value":"6m"},"isForSaleByAgent":{"value":False},"isForSaleByOwner":{"value":False},"isNewConstruction":{"value":False},"isForSaleForeclosure":{"value":False},"isComingSoon":{"value":False},"isAuction":{"value":False},"isPreMarketForeclosure":{"value":False},"isPreMarketPreForeclosure":{"value":False},"isRecentlySold":{"value":True},"isAllHomes":{"value":True},"hasPool":{"value":True},"hasAirConditioning":{"value":True},"isApartmentOrCondo":{"value":False}},"isListVisible":True,"mapZoom":11},
    'wants': {"cat1":["listResults","mapResults"]},
    'requestId': 2
}

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.150 Safari/537.36'
    res = s.get(link,params=json.dumps(params))
    pprint(res.content)
Run Code Online (Sandbox Code Playgroud)

这是它产生的输出:

b'<!-- This page outputs JSON instead of anything written here. -->'
Run Code Online (Sandbox Code Playgroud)

如何使用请求解析来自 zillow 的自定义属性链接?

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

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

无法使用请求抓取 graphql 页面

我正在尝试使用请求模块从网页中抓取公司名称及其相应的链接。

尽管内容非常动态,但我可以注意到它们在window.props.

所以,我想挖出那部分并使用 json 处理它,但我看到\u0022周围的字符而不是引号"。这就是我的意思:

{\u0022firms\u0022: [{\u0022index\u0022: 1, \u0022slug\u0022: \u0022zjjz\u002Datelier\u0022, \u0022name\u0022:
Run Code Online (Sandbox Code Playgroud)

我试过:

import re
import json
import requests
from bs4 import BeautifulSoup

link = 'https://architizer.com/firms/'

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'
    r = s.get(link)
    items = re.findall(r'window.props[^"]+(.*?);',r.text)[0].strip('"').replace('\u0022', '\'')
    print(items)
Run Code Online (Sandbox Code Playgroud)

如何使用请求从该网页中抓取不同公司的名称和链接?

python beautifulsoup web-scraping python-3.x graphql

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

如何在vba中创建循环以块的形式迭代列表?

我试图从主列表创建 3 个子列表itemlist,但我找不到任何方法来实现这一点。当我查看此链接时,我在 python 中找到了解决方案。

Sub CreateSubList()
    Dim itemlist As Variant, itemNum As Variant
    Dim oSublist As Variant
    
    itemlist = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11")
    
    'here I was expecting to create a variable holding sublist, as in oSublist which contains Array("1", "2", "3", "4")
    'Array("5", "6", "7", "8") and Array("9", "10", "11") in each loop
    'and finally iterate over the list in chunk to print the result
    
    For Each itemNum …
Run Code Online (Sandbox Code Playgroud)

vba list

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

无法从网页中获取不同职位的标题

我已经使用 selenium 在 python 中编写了一个脚本来获取从网页遍历多个页面的不同作业的标题。当我运行脚本时,我可以注意到 selenium 无法打开该网页。但是,我可以在 Internet Explorer 或 Chrome 中手动使用该链接轻松查看该页面的内容。

网页链接 #如果看不到内容,请务必刷新页面

我试过:

from bs4 import BeautifulSoup
from selenium import webdriver

URL = 'https://www.alljobs.co.il/SearchResultsGuest.aspx?page=1&position=235,330,320,236,1541&type=&city=&region='

with webdriver.Chrome() as driver:
    driver.get(URL)
    soup = BeautifulSoup(driver.page_source,'lxml')

    while True:
        for item in soup.select('[class="job-content-top"]'):
            title = item.select_one('.job-content-top-title a[title')
            print(title)

        try:
            next_page = driver.find_elemeny_by_css_selector('.jobs-paging-next > a').click()
            soup = BeautifulSoup(driver.page_source,'lxml')
        except Exception:
            break
Run Code Online (Sandbox Code Playgroud)

我什至这样尝试过,但这也不起作用(从浏览器收集的 cookie):

from bs4 import BeautifulSoup
from selenium import webdriver

URL = 'https://www.alljobs.co.il/SearchResultsGuest.aspx?page=1&position=235,330,320,236,1541&type=&city=&region='

cookie = "_ga=GA1.3.1765365490.1582505881; _gid=GA1.3.568643527.1582505881; _fbp=fb.2.1582505881473.1930545410; _hjid=619e3a88-ee5a-43ca-8a0b-e70b063dcf84; BlockerDisplay=; DiplayPopUpSalarySurvey=; OB-USER-TOKEN=390dca4f-08d0-4f54-bce5-00e7e6aa3e39; LPVID=dkY2EwOTNmZTA4YTM1MDI1; …
Run Code Online (Sandbox Code Playgroud)

python selenium beautifulsoup web-scraping python-3.x

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

当带有参数的发布请求开始起作用时,无法使用 urllib 从网站下载 csv 文件

我正在尝试使用 urllib 包从网页下载 csv 文件。要从该站点下载 csv 文件,必须发送带有适当参数的 post 请求。

当我尝试使用请求模块时,我可以完美地下载文件。但是,当我尝试使用 urllib 包做同样的事情时,我也得到了一个 csv 文件,但这次文件只包含标题。尸体不见了。

以下是从该站点手动下载该文件的方法:

Site address: https://www.nyiso.com/custom-reports?report=dam_lbmp_zonal
Zones: CAPITL, CENTRL
Version: Latest
Format: CSV
Hit `Generate Report` button
Run Code Online (Sandbox Code Playgroud)

以下脚本仅下载 csv 文件中的标题:

import csv
import urllib.request
import urllib.parse

link = "http://dss.nyiso.com/dss_oasis/PublicReports"
params = {
    'reportKey': 'DAM_LBMP_ZONE',
    'startDate': '04/17/2021',
    'endDate': '04/17/2021',
    'version': 'L',
    'dataFormat': 'CSV',
    'filter': ['CAPITL','CENTRL'],
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
data = urllib.parse.urlencode(params).encode()
req = urllib.request.Request(link, data=data, headers=headers) …
Run Code Online (Sandbox Code Playgroud)

python post urllib web-scraping python-3.x

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

无法从包含非常规内容的网页中获取某些字段

当我尝试使用请求从网页中抓取某些字段时,我遇到了如下所示的外部内容,我找不到任何从中获取数据的想法。以下是我收到的回复的一小部分:

    I: Qc[
    j~O~_
]S6gMWNougj~Ougp_{
    hr[
        ogL>i
    ]OqNotnYr=nQHOGirKugLKngL[
        Kh
    ][
        uiMpnTnNpSYR: QIZSXNxNpOq_MRnTnN5Nn|nV[
            _SNotnOIh~Rn|9 RIFnQHOuh6Smg\[
                S^\qxf\: sY8OKjL[
                    yhMVnTnO__
                ]RnQHOYhZ_5NotnRn|
            }TYFnQHOIf
        ]W: NotnVZSZY59nQHOuh5
    }uh8Wq_J_{
        hqSmgLZnTnOTg~NxNpOmiLmNotnRnNxNp>8 gr[
            ~NotnW5>
        ]XZ: MQJ6OV5mGWZ|lXnNxNrqz[
            LK9WL[
                xf\:
            }i\[
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以将内容转换为常规 html 或 json。

这是这些元素中应该包含的一些地址:

Franklin St
Great Rd
Nonset Path
Run Code Online (Sandbox Code Playgroud)

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

0
推荐指数
1
解决办法
460
查看次数

无法让脚本记住其上次刮取的结果

我已经在python中创建了一个脚本,以从网站中获取不同帖子的标题,并且可以完美地捕获它们。

但是,我现在希望此脚本执行的操作是记住上一次抓取的结果,以便当我运行两次时,它不会获取相同的结果。更清楚地说-脚本将在第一次执行时照常解析结果,但在找不到新帖子之前,它将在后续执行中无法获取相同的结果。

使用csv

import csv
import requests
from bs4 import BeautifulSoup

def get_posts(url):   
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")
    for item in soup.select(".summary .question-hyperlink"):
        yield item.text

if __name__ == '__main__':
    link = '/sf/ask/tagged/web-scraping/'
    with open("output.csv","w",newline="") as f:
        writer = csv.writer(f)
        for item in get_posts(link):
            writer.writerow([item])
            print(item)
Run Code Online (Sandbox Code Playgroud)

使用数据库

import mysql.connector
from bs4 import BeautifulSoup
import requests

url = "/sf/ask/tagged/web-scraping/"

def connect():
    mydb = mysql.connector.connect(
      host="localhost",
      user="root",
      passwd = "",
      database="mydatabase"
    )
    return mydb

def create_table(link):
    conn = connect()
    mycursor …
Run Code Online (Sandbox Code Playgroud)

python beautifulsoup web-scraping python-3.x

-1
推荐指数
1
解决办法
255
查看次数

无法使用请求模块从静态网页中抓取不同的公司名称

我创建了一个脚本来使用请求模块从该网站收集不同的公司名称,但是当我执行该脚本时,它最终什么也没得到。我在页面源中查找了公司名称,发现这些名称在那里可用,因此它们似乎是静态的。

import requests
from bs4 import BeautifulSoup

link = 'https://clutch.co/agencies/digital-marketing'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
}

with requests.Session() as s:
    s.headers.update(headers)
    res = s.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    for item in soup.select("h3.company_info > a"):
        print(item.text)
Run Code Online (Sandbox Code Playgroud)

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

-2
推荐指数
1
解决办法
396
查看次数

使用中间件将重定向网址替换为原始网址后,无法以正确的方式发送请求

我使用 scrapy 创建了一个脚本来从网页中获取一些字段。登陆页面的 url 和内部页面的 url 经常被重定向,因此我创建了一个中间件来处理该重定向。然而,当我看到这篇文章时,我明白我需要return requestprocess_request()用原始网址替换重定向网址后。

meta={'dont_redirect': True,"handle_httpstatus_list": [301,302,307,429]}当请求从蜘蛛发送时,它总是存在的。

由于所有请求都没有被重定向,我尝试替换_retry()方法中的重定向网址。

def process_request(self, request, spider):
    request.headers['User-Agent'] = self.ua.random

def process_exception(self, request, exception, spider):
    return self._retry(request, spider)

def _retry(self, request, spider):
    request.dont_filter = True
    if request.meta.get('redirect_urls'):
        redirect_url = request.meta['redirect_urls'][0]
        redirected = request.replace(url=redirect_url)
        redirected.dont_filter = True
        return redirected
    return request

def process_response(self, request, response, spider):
    if response.status in [301, 302, 307, 429]:
        return self._retry(request, spider)
    return response
Run Code Online (Sandbox Code Playgroud)

问题:使用中间件将重定向的 url 替换为原始 url 后如何发送请求?

python middleware scrapy web-scraping python-3.x

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