繁体   English   中英

网站不允许使用python提取数据

[英]Website not allowing to extract data using python

我正在尝试从网页( https://clinicaltrials.gov )提取数据,我已经使用selenium和lxml构建了一个scraper,并且工作正常。 第一页抓取完成后,我需要点击下一页按钮。转到下一页后,我需要使用(driver.current_url)获取该页面的网址,然后再次开始抓取。

这里的问题是搜索结果表只在变化,而URL保持不变。 因此,每当驱动程序采用当前URL(driver.current_url)时,首页结果就会一次又一次地出现。

编辑:这是代码

import re
import time
import urllib.parse
import lxml.html
import pandas as pd
import requests
import urllib3
from lxml import etree
from lxml import html
from pandas import ExcelFile
from pandas import ExcelWriter
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
import selenium.webdriver.support.expected_conditions as EC

siteurl = 'https://clinicaltrials.gov/'
driver = webdriver.Chrome()
driver.get(siteurl)
WebDriverWait(driver, 5)
driver.maximize_window()

def advancesearch():
    driver.find_element_by_link_text('Advanced Search').click()
    driver.find_element_by_id('StartDateStart').send_keys('01/01/2016')
    driver.find_element_by_id('StartDateEnd').send_keys('12/30/2020')
    webdriver.ActionChains(driver).send_keys(Keys.ENTER).perform()
    time.sleep(3)

driver.find_element_by_xpath("//input[contains(@id, 'home-search-condition-query')]").send_keys('medicine') #Give keyword here
advancesearch()
#driver.find_element_by_xpath("//div[contains(@class, 'dataTables_length')]//label//select//option[4]").click()
#time.sleep(8)

def nextbutton():
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)
    driver.find_element_by_xpath("//a[contains(@class, 'paginate_button next')]").click()

def extractor():
    cur_url = driver.current_url
    read_url = requests.get(cur_url)
    souptree = html.fromstring(read_url.content)
    tburl = souptree.xpath("//table[contains(@id, 'theDataTable')]//tbody//tr//td[4]//a//@href")
    for tbu in tburl:
        allurl = []
        allurl.append(urllib.parse.urljoin(siteurl, tbu))
        for tb in allurl:
            get_url = requests.get(tb)
            get_soup = html.fromstring(get_url.content)
            pattern = re.compile("^\s+|\s*,\s*|\s+$")
            name = get_soup.xpath('//td[@headers="contactName"]//text()')
            phone = get_soup.xpath('//td[@headers="contactPhone"]//text()')
            mail = get_soup.xpath('//td[@headers="contactEmail"]//a//text()')
            artitle = get_soup.xpath('//td[@headers="contactEmail"]//a//@href')
            artit = ([x for x in pattern.split(str(artitle)) if x][-1])
            title = artit[:-2]
            for (names, phones, mails) in zip(name, phone, mail):
                fullname = names[9:]
                print(fullname, phones, mails, title, sep='\t')

while True:
    extractor()
    nextbutton()

如果页面已经更改,则无需获取URL。 您可以从单击页面后重新加载页面时开始重新迭代。 您可以让驱动程序等待,直到出现一个元素( 显式wait ),或者只是等待( 隐式wait )。

我可能会做出很多更改(例如,使用较短的不那么脆弱的css选择器和bs4),但其中两个很明显:

1)您已经有了所需的数据,因此不需要新的URL。 只需使用驱动程序的当前page_source。

所以提取函数的顶部变成

def extractor():
    souptree = html.fromstring(driver.page_source)
    tburl = souptree.xpath("//table[contains(@id, 'theDataTable')]//tbody//tr//td[4]//a//@href")
    #rest of code

2)为了减少迭代,我会在开始时将结果计数设置为100

def advancesearch():
    driver.find_element_by_link_text('Advanced Search').click()
    driver.find_element_by_id('StartDateStart').send_keys('01/01/2016')
    driver.find_element_by_id('StartDateEnd').send_keys('12/30/2020')
    webdriver.ActionChains(driver).send_keys(Keys.ENTER).perform()
    time.sleep(3)
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#theDataTable_length [value='100']"))).click() #change for 100 results so less looping

然后添加其他导入

from selenium.webdriver.common.by import By

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM