selenium Python Scraper无法完成

6tqwzwtp  于 2023-02-08  发布在  Python
关注(0)|答案(3)|浏览(120)

我正在用这个来编码从谷歌搜索结果中刮取电子邮件。但是,尽管加载了100个搜索结果,它只刮取了前10个结果。
理想情况下,我希望它刮所有的搜索结果。
有什么原因吗?

from selenium import webdriver
import time
import re
import pandas as pd

PATH = 'C:\Program Files (x86)\chromedriver.exe'


l=list()
o={}

target_url = "https://www.google.com/search?q=solicitors+wales+%27email%27+%40&rlz=1C1CHBD_en-GBIT1013IT1013&sxsrf=AJOqlzWC1oRbVtWcmcIgC4-3ZnGkQ8sP_A%3A1675764565222&ei=VSPiY6WeDYyXrwStyaTwAQ&ved=0ahUKEwjlnIy9lYP9AhWMy4sKHa0kCR4Q4dUDCA8&uact=5&oq=solicitors+wales+%27email%27+%40&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzIFCAAQogQyBwgAEB4QogQyBQgAEKIESgQIQRgASgQIRhgAUABYAGD4AmgAcAF4AIABc4gBc5IBAzAuMZgBAKABAcABAQ&sclient=gws-wiz-serp"

driver=webdriver.Chrome(PATH)

driver.get(target_url)

email_pattern = r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,4}"
html = driver.page_source
emails = re.findall(email_pattern, html)


time.sleep(10)
df = pd.DataFrame(emails, columns=['Email Addresses'])
df.to_excel('email_addresses_.xlsx',index=False)
# print(emails)
driver.close()
jmp7cifd

jmp7cifd1#

这段代码运行正常,google搜索的默认结果是10个,你可以使用find_element_by_xpath等方法找到下一个按钮并点击它。
需要执行此操作,直到在循环中收集到足够的结果。有关更多详细信息,请参阅此操作selenium locating elements
如何使用selenium命令,也许你可以上网查一下,我找到了一个类似的question,可以提供一些参考

zbwhf8kr

zbwhf8kr2#

根据Bijendra的回答,您可以更新代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import re
import pandas as pd

PATH = 'C:\Program Files (x86)\chromedriver.exe'

l=list()
o={}

target_url = "https://www.google.com/search?q=solicitors+wales+%27email%27+%40&rlz=1C1CHBD_en-GBIT1013IT1013&sxsrf=AJOqlzWC1oRbVtWcmcIgC4-3ZnGkQ8sP_A%3A1675764565222&ei=VSPiY6WeDYyXrwStyaTwAQ&ved=0ahUKEwjlnIy9lYP9AhWMy4sKHa0kCR4Q4dUDCA8&uact=5&oq=solicitors+wales+%27email%27+%40&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzIFCAAQogQyBwgAEB4QogQyBQgAEKIESgQIQRgASgQIRhgAUABYAGD4AmgAcAF4AIABc4gBc5IBAzAuMZgBAKABAcABAQ&sclient=gws-wiz-serp"

driver=webdriver.Chrome(PATH)

driver.get(target_url)
emails = []
email_pattern = r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,4}"
for i in range(2):
    html = driver.page_source
    for e in re.findall(email_pattern, html):
        emails.append(e)
    a_attr = driver.find_element(By.ID,"pnnext")
    a_attr.click()
    
time.sleep(2)
df = pd.DataFrame(emails, columns=['Email Addresses'])
df.to_csv('email_addresses_.csv',index=False)
driver.close()

您可以更改传入for循环的范围值,也可以用while循环完全替换for循环,从而将

for i in range(2):

您可以:

while len(emails) < 100:

请务必管理时间,当页面导航到下一页,并等待下一页加载之前提取可用的电子邮件,然后移动到点击搜索结果页面上的下一个按钮。请务必参考文档,以获得一个清晰的想法,你应该做什么,以实现你想要的。快乐黑客!

yzckvree

yzckvree3#

Selenium会加载自己的空浏览器,所以你需要在代码中设置100个结果,因为默认值是10个结果,你会有更好的运气使用查询参数,并添加一个结果的数量到您的URL的末尾
如果您需要有关查询参数的更多信息来实现此目的,请使用下面介绍的第二种方法tldevtech.com/how-to-show-100-results-per-page-in-google-search

相关问题