python 模拟鼠标点击+bs4一键爬取多个网页新闻(题目、媒体、日期、内容、url)

在搜狗新闻中,输入关键词(两岸关系发展前景)后,出现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循环来爬取。

扫描二维码关注公众号,回复: 10565936 查看本文章

由上图可知,所需爬取的内容包括:内容(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

最后所爬取的结果如下图所示:

 

发布了35 篇原创文章 · 获赞 26 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_42342968/article/details/83863413