前言
在项目中我所负责的部分是爬虫部分,在这一周我主要的工作是尝试简单的爬虫爬取网站数据,熟悉各个主流舆论网站的爬取过程,以便与后面项目更好的对接。
一、百度新闻
我们观察到百度新闻在网页上显示的页数是20页,即总网页数大概是200多个,且对于时间的观察得知百度新闻大概是几天更新一次,所以对百度新闻的爬取策略是先爬取下所有网页及其时间戳,待几天后更新数据。
首先我们对百度新闻的网页机器时间戳进行爬取,获取其网址,标题以及时间戳
。
相关代码
代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
from pyquery import PyQuery as pq
import pandas as pd
import re
# 让网页不加载图片
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images":2}
chrome_options.add_experimental_option("prefs",prefs)
browser = webdriver.Chrome(options=chrome_options)
wait = WebDriverWait(browser, 10)
urls_list = []
title_list = []
time_list = []
urls = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&rsv_dl=ns_pc&word=%E5%B1%B1%E4%B8%9C%E5%A4%A7%E5%AD%A6&x_bfe_' \
'rqs=03E80000001&x_bfe_tjscore=0.100000&tngroupname=organic_news&newVideo=12&pn='
# 根据page翻页
def next_page(page):
# 解决加载超时出错
try:
browser.get(urls+str(page))
sleep(1)
# 等待加载出底部页面信息加载出来
total = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#page > div'))
)
except TimeoutError:
return next_page()
# 获取网页信息
def get_urls():
try:
# 拉动滚轴使页面加载底端的页面元素
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
sleep(2)
# 等待最后一个商品加载出来
# 获取网页源码
html = browser.page_source
doc = pq(html)
# id是#
items = doc('.news-title_1YtI1').items()
# enumerate()枚举计算,记录新闻的链接
for index, i in enumerate(items):
urls_list.append(i(' a').attr('href'))
if len(i(' a').text()) == 0:
title_list.append(" ")
else:
title_list.append(i(' a').text())
items = doc('.news-source').items()
# enumerate()枚举计算,记录新闻的时间戳
for index, i in enumerate(items):
time_list.append(i('.c-color-gray2').text())
except:
get_urls()
def main():
for i in range(0, 18):
next_page(i * 10)
get_urls()
dframe = pd.DataFrame({'网址': urls_list, '标题':title_list, '时间戳': time_list})
dframe.to_csv('baidu_urls.csv', index=False, sep=',', encoding='utf_8_sig')
if __name__ == '__main__':
main()
二.今日头条
对于今日头条的爬取策略和百度新闻的爬取策略大致相同,二者的更新频率大致相同,但是今日头条获取新闻需要与百度新闻有所不同,因为今日头条是滑轮向下滚动获取新闻,所以我们要用程序模拟浏览器操作。
相关代码
代码如下:
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images":2}
chrome_options.add_experimental_option("prefs",prefs)
browser = webdriver.Chrome(options=chrome_options)
wait = WebDriverWait(browser, 10)
urls_list = []
title_list = []
time_list = []
urls = 'https://www.toutiao.com/search/?keyword=%E5%B1%B1%E4%B8%9C%E5%A4%A7%E5%AD%A6'
# 根据page翻页
def search():
# 解决加载超时出错
try:
browser.get(urls)
sleep(1)
# 等待加载出页面信息加载出来
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'body > div > div.y-box.container >'
' div.y-left.index-middle > div.feedBox > div > div'))
)
except TimeoutError:
return search()
# 获取网页信息
def get_urls():
try:
# 拉动滚轴使页面加载底端的页面元素
for i in range(8):
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
sleep(2)
# 等待最后一个商品加载出来
# 获取网页源码
html = browser.page_source
doc = pq(html)
# id是#
items = doc('.articleCard').items()
# enumerate()枚举计算,记录新闻的链接
for index, i in enumerate(items):
urls_list.append('https://www.toutiao.com' + i('.link.title').attr('href'))
title_list.append(i('.J_title').text())
time_list.append((i('.lbtn').text()))
except:
get_urls()
def main():
search()
get_urls()
dframe = pd.DataFrame({'网址': urls_list, '标题':title_list, '时间戳': time_list})
dframe.to_csv('headline_urls.csv', index=False, sep=',', encoding='utf_8_sig')
if __name__ == '__main__':
main()
总结
这样的数据量对于整个项目来说肯定是不够的,所以在这之后考虑用二级爬取获取网页内的相应内容,以此来获取更多的数据量。并且 考虑用scrapy爬虫框架爬取网页,定义itcast.py爬虫以及items.py来定义数据结构,再通过管道来储存,这样子能够提高爬虫编写效率。