我尝试使用带有 lxml 的 xpath 从 html 标记中抓取下一页的 href 链接。但是 xpath 返回空列表,而它是单独测试的,它似乎可以工作。
我已经尝试了 css 选择器和 xpath,它们都返回空列表。
代码返回空值,而 xpath 似乎工作正常。
import sys
import time
import urllib.request
import random
from lxml import html
import lxml.html
import csv,os,json
import requests
from time import sleep
from lxml import etree
username = 'username'
password = 'password'
port = port
session_id = random.random()
super_proxy_url = ('http://%s-session-%s:%s@zproxy.lum-superproxy.io:%d' %(username, session_id, password, port))
proxy_handler = urllib.request.ProxyHandler({
'http': super_proxy_url,
'https': super_proxy_url,})
opener = urllib.request.build_opener(proxy_handler)
opener.addheaders = \[('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36')]
print('Performing request')
page = self.opener.open("https://www.amazon.com/s/ref=lp_3564986011_pg_2/133-0918882-0523213?rh=n%3A283155%2Cn%3A%211000%2Cn%3A1%2Cn%3A173508%2Cn%3A266162%2Cn%3A3564986011&page=2&ie=UTF8&qid=1550294588").read()
pageR = requests.get("https://www.amazon.com/s/ref=lp_3564986011_pg_2/133-0918882-0523213?rh=n%3A283155%2Cn%3A%211000%2Cn%3A1%2Cn%3A173508%2Cn%3A266162%2Cn%3A3564986011&page=2&ie=UTF8&qid=1550294588",headers={"User-Agent":"Mozilla/5.0"})
doc=html.fromstring(str(pageR))
html = lxml.html.fromstring(str(page))
links = html.cssselect('#pagnNextLink')
for link in links:
print(link.attrib['href'])
linkRef = doc.xpath("//a[@id='pagnNextLink']/@href")
print(linkRef)
for post in linkRef:
link="https://www.amazon.com%s" % post
我在这里尝试了两种方法,但它们似乎都不起作用。
我正在使用代理服务器来访问链接,它似乎可以正常工作,因为“doc”变量正在填充 html 内容。我检查了链接,我在正确的页面上获取这个 xpath/csslink。
最佳答案
更有经验的人可能会就您的设置提供更好的建议,因此我将简单说明我的经验:
当我使用 requests
时,我有时会获得链接,有时却没有。如果不是,响应表明它正在检查我不是机器人并确保我的浏览器允许 cookie。
使用 selenium 我在测试中可靠地得到了结果,尽管这可能不够快,或者出于其他原因不适合您。
from selenium import webdriver
d = webdriver.Chrome()
url = 'https://www.amazon.com/s/ref=lp_3564986011_pg_2/133-0918882-0523213?rh=n%3A283155%2Cn%3A%211000%2Cn%3A1%2Cn%3A173508%2Cn%3A266162%2Cn%3A3564986011&page=2&ie=UTF8&qid=1550294588'
d.get(url)
link = d.find_element_by_id('pagnNextLink').get_attribute('href')
print(link)
带有代理的 Selenium (Firefox):
Running Selenium Webdriver with a proxy in Python
Selenium with proxy (Chrome) - 此处介绍得很好:
关于使用 lxml、xpath 和 css 选择器的 Python 脚本也返回空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54720563/