1. 程式人生 > >python 模擬滑鼠點選+bs4爬取多個網頁新聞(題目、媒體、日期、內容、url)

python 模擬滑鼠點選+bs4爬取多個網頁新聞(題目、媒體、日期、內容、url)

在搜狗新聞中,輸入關鍵詞(兩岸關係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

最後所爬取的結果如下圖所示: