python爬虫为什么xpath路径正确却检索不到内容_中国知网爬虫
一、知網介紹
提起中國知網,如果你曾經寫過論文,那么基本上都會與中國知網打交道,因為寫一篇論文必然面臨著各種查重,當然翟博士除外。但是,本次重點不在于寫論文跟查重上,而在于我們要爬取知網上一些論文的數據,什么樣的數據呢?我們舉一個例子來說,在知網上,搜索論文的方式有很多種,但是對于專業人士來說,一般都會使用高級檢索,因為直接去查找作者的話,容易查找到很多重名作者,所以我們本次的爬蟲也是使用了高級檢索(泛稱)的爬蟲,再具體就是專業檢索,有助于我們唯一定位到作者。二、常規步驟—頁面分析
1.來到高級檢索頁面,以【AU=王長峰 AND FU=71271031】為例檢索,結果如下:
2.利用Xpath語法嘗試獲取這些數據,卻發現一無所獲。
3.按照常理來說,即使是動態網頁也可以利用Xpath語法提取到數據,只是在Python里面獲取不到而已,所以在這里存在我們所不知道的問題。
三、知網反爬蟲機制
常見的反爬蟲機制一般有兩種:
第一種是請求頭反爬蟲,這個也是最簡單的,如果你不給定請求頭,對方服務器就不會理你。需要設置的參數有User-Agent、Referer和Cookie。
第二種是動態網頁,利用Ajax技術使用js接口來傳遞數據。
毫無疑問,對于數據非常金貴的中國知網來說,肯定使用了以上兩種反爬方式,并且中國知網的js接口非常復雜,雖說復雜,但是只要你的內功要是足夠強的話,還是能夠分析得出來,但是對于不懂js以及web開發的朋友來說,這將是一個非常困難的事情,所以使用selenium來進行爬蟲將是一件相對來說比較容易的事情。
另外,知網也不是僅僅只有這兩層反爬蟲機制,還有第三層,那就是iframe,由于很多朋友并沒有做過網站開發,所以不太清楚了這是什么東西,導致即使發現自己的Xpath語法正確,也無法正確獲取數據,從而懷疑人生,實際上,iframe比較常見的一種反爬蟲機制,不過,如果你不知道這個東西,那么你就基本上無緣爬取中國知網了。
四、什么是iframe?
了解iframe前,你首先得知道一個網頁是什么,沒錯,一個網頁就是一個html頁面。接下來我們從感性和源碼兩個方面來認識一下iframe.
1.感性認知。
一句話:一個完整的網頁內部又嵌套了多個完整的網頁,嵌套的頁面就叫做iframe。
2.網頁源碼認識。
比如一個非常簡單的html頁面(如下圖所示),一個html頁面是擁有一個完整的html標簽的,也就是起始html【】和閉合html【】,而iframe則是在這一個完整的html標簽里面又嵌套了一個完整的html標簽。
<html><body><p>Python伊甸園p>body>html>3.看一下中國知網的源碼,發現果然存在一個iframe,所以這個就是中國知網的第三種反爬蟲機制。
五、最后給出中國知網的爬蟲
1.ways.py
import pandas as pd#AU=王長峰 AND FU=71271031def get_data(): data_list = pd.read_excel(r"C:\Users\wwb\Desktop\科學基金.xls", encoding='utf8') leaders = data_list.leader.values.tolist() codes = data_list.code.tolist() results = [] for leader,code in zip(leaders,codes): result = "AU={} AND FU={}".format(leader,code) results.append(result) return results2.main.py
from selenium import webdriverfrom lxml import etreeimport timefrom ways import get_dataimport randomdef pasre_page(driver): html = etree.HTML(driver.page_source) trs = html.xpath('//tr[@bgcolor]') for tr in trs: title = tr.xpath('./td//a[@]/text()')[0] authors = tr.xpath('./td[@]/a[@]//text()') authors = "|".join(authors) source = tr.xpath('./td//a[@target="_blank"]/text()')[1] times = tr.xpath('./td[@align="center"]/text()')[0].strip() database = tr.xpath('./td[@align="center"]/text()')[1].strip() counted = tr.xpath('./td//span[@]/a/text()') if len(counted) == 0: counted = 0 else: counted = counted[0] downloadCount = tr.xpath('./td//span[@]/a/text()') if len(downloadCount) == 0: downloadCount = 0 else: downloadCount = downloadCount[0] data = { "title":title, "authors":authors, "source":source, "times":times, "database":database, "counted":counted, "downloadCount":downloadCount, } datas.append(data) print(title) time.sleep(random.uniform(2,4)) driver.switch_to.parent_frame() search_win = driver.find_element_by_id('expertvalue') search_win.clear() time.sleep(random.uniform(2,4)) driver_path = r"C:\Users\wwb\Desktop\chromedriver.exe"driver = webdriver.Chrome(executable_path=driver_path)url = "https://www.cnki.net/"driver.get(url)home_page = driver.find_element_by_id('highSearch')home_page.click()driver.switch_to_window(driver.window_handles[1])search_page = driver.find_element_by_id('1_3')search_page.click()datas = []results = get_data()for result in results: search_win = driver.find_element_by_id('expertvalue') search_win.send_keys(result) search_btn = driver.find_element_by_id('btnSearch') search_btn.click() iframe = driver.find_element_by_id('iframeResult') driver.switch_to.frame(iframe) time.sleep(random.uniform(2,4)) pasre_page(driver)3.部分結果展示:
Python伊甸園qq交流總群:725962878,有興趣大家一塊兒交流Python知識。
微信公眾號:Python伊甸園
總結
以上是生活随笔為你收集整理的python爬虫为什么xpath路径正确却检索不到内容_中国知网爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: d-s 多传感器信息融合 matlab实
- 下一篇: thinkphp mysql批量入库_T