python 模擬滑鼠點選+bs4爬取多個網頁新聞(題目、媒體、日期、內容、url)
阿新 • • 發佈:2018-12-20
在搜狗新聞中,輸入關鍵詞(兩岸關係fa發展前景)後,出現6頁有關於這個關鍵詞的新聞。
現在目的就是爬取有關這個關鍵詞的網頁文章,如題目、媒體、日期、內容、url。如下圖:
載入包
import requests
from bs4 import BeautifulSoup #bs4
import re
import pandas as pd
import urllib.request
from selenium import webdriver #模擬滑鼠點選
#開啟Firefox瀏覽器,模擬器 driver = webdriver.Chrome() driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver") #第一頁的網址 url = "https://news.sogou.com/news?oq=%C1%BD%B0%B6%B9%D8%CF%B5&mode=1&manual=&stj0=8&query=%C1%BD%B0%B6%B9%D8%CF%B5%B7%A2%D5%B9%C7%B0%BE%B0&stj=8%3B0%3B0%3B0&stj2=0&stj1=0&hp=0&time=0&hp1=&sut=18021&lkt=0%2C0%2C0&ri=8&sst0=1541664088389&sort=1&page=1&w=01025001&dr=1" driver.get(url) # 模擬瀏覽器 解析網頁 r = requests.get(url) #請求網頁 soup =BeautifulSoup(r.text,"html.parser") # bs4 解析網頁
獲取關鍵詞所得到有關文章的頁數,這裡是6頁。
a=str(soup.find_all(name = "div",attrs = {"class":"p"})) #獲取div區域下的內容解析
url= re.findall(r'<a href="(.*?)" ',a) #用re正則來獲取所有頁數url
page=len(url)+1 #獲取頁數的長度,由於正則匹配的時候,匹配到除本頁以外的所有頁數url不匹配,所以+1
page
首先建立空的列表,以便存放待會爬出來的資料。
content=[] #建立空的列表,存放資料 title=[] url=[] media=[] time=[]
然後,開始爬取所需要的文字,因為知道了所有的頁數有6頁,所以,採取for迴圈來爬取。
由上圖可知,所需爬取的內容包括:內容(content)、題目(title)、網址(url)、媒體(media)、日期(time)。
經檢視這6頁的原始碼,發現,每篇文章所需爬取的資訊所在的區域是一樣的,所以,採用for迴圈的方法,一鍵爬取。
所爬取得網頁有6頁,如上圖所示: 可知道,每一頁的網址,只有page改變了。因此可以for迴圈頁面網址。
for i in range(page): baseurl ="https://news.sogou.com/news?oq=%C1%BD%B0%B6%B9%D8%CF%B5&mode=1&manual=&stj0=8&query=%C1%BD%B0%B6%B9%D8%CF%B5%B7%A2%D5%B9%C7%B0%BE%B0&stj=8%3B0%3B0%3B0&stj2=0&stj1=0&hp=0&time=0&hp1=&sut=18021&lkt=0%2C0%2C0&ri=8&sst0=1541664088389&sort=1&page="+str(i)+"&w=01025001&dr=1" #網址迴圈,6頁的網址 #print(i,baseurl) r = requests.get(baseurl) soup =BeautifulSoup(r.text,"html.parser") #bs4解析網址 driver.get(baseurl) #print(i,baseurl) title1 = driver.find_elements_by_xpath("//h3[@class='vrTitle']/a") #模擬滑鼠點選方法,獲取標題 for a in title1: title.append(a.text) data=str(soup.find_all(name = "h3",attrs = {"class":"vrTitle"})) #bs4方法,獲取每篇文章的url所在區域下的網頁解析 url1= re.findall(r'<a href="(.*?)" ',data) #正則匹配出每篇文章的url,data的格式要求是文字 for a in url1: url.append(a) #print(a) for b in soup.find_all(name = "p",attrs = {"class":"news-from"}): #bs4方法,獲取每篇文章的媒體型別和釋出日期 temp = b.get_text().strip() media.append(temp.split("\xa0")[0]) time.append(temp.split("\xa0")[1]) #print(media) #print(time) content1 = driver.find_elements_by_xpath("//p[@class='news-txt']/span") #模擬滑鼠點選方法,獲取每篇文章的內容 for result in content1: content.append(result.text) #print(result.text)
最後、建立一個excel文件儲存文章的內容(content)、題目(title)、網址(url)、媒體(media)、日期(time)。
df = pd.DataFrame(columns=["content","title","url","media","time"]) #建立文件
df["content"]= content #儲存每一列資料
df["title"]= title
df["url"] = url
df['media'] = media
df["time"] = time
df.to_excel("爬蟲.xlsx",index=False) #儲存excel
最後所爬取的結果如下圖所示: