感谢Datawhale组织的学习,经过这几天的学习,已经初步了解了简单的python爬虫实现,这里简单介绍一个新闻的爬虫实现。
之所以要使用selenium,是因为新闻的网页是动态的,它会根据使用的操作来加载,因此需要selenium模拟用户的操作。
import time
from selenium import webdriver
from bs4 import BeautifulSoup
import csv
如果静态的打开新闻的网页,仅能加载出10条新闻,若想加载的更多需要将鼠标滚动到页面底部,为了安全起见,每次操作的前后都sleep1秒
翻页的次数根据要爬取的新闻数进行估算
def getHTMLText(url, num):
driver = webdriver.Chrome()
driver.get(url)
#driver.get("https://news.qq.com/")
page = int(num/10) + 1
for i in range(page):
time.sleep(1)
#鼠标滚动到页面最低部,为了加载后面的新闻
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(1)
html = driver.page_source
driver.quit() # 关闭浏览器窗口
return html
然后用BeautifulSoup库识别出要爬取的页面信息并加以存储
def parseHTML(html, item):
soup = BeautifulSoup(html, 'html.parser')
for li in soup.find_all('li',['item cf','item-pics cf']):
if li.attrs['class'] == ['item', 'cf']:
alist = li('a')[1]
else:
alist = li('a')[0]
item.append([alist.text.lstrip(),alist.attrs['href']])
接下来将爬取到的信息打印出来,并存储为csv格式的文件
def printNews(item, num):
tplt = "{0:<1} , {1:{3}<1} , {2:<10}"
with open('news.csv', 'w') as f:
# 实例化csv.writer对象
writer = csv.writer(f)
# 用writerows方法将数据以指定形式保存
writer.writerow(['index', 'title', 'url'])
print(tplt.format('index', 'title', 'url', chr(12288)))
for i in range(num):
u = item[i]
writer.writerow([str(i+1), u[0], u[1]])
print(tplt.format(i+1, u[0], u[1], chr(12288)))
url = "https://news.qq.com/"
item = []
num = 50
html = getHTMLText(url, num)
parseHTML(html, item)
printNews(item, num)
我之前翻页采用的是笨办法,每次将鼠标滚动至页面底部,还可以每次滚动一定的距离,这里是固定的像素,不过效果都是相同的。
import time
from selenium import webdriver
driver=webdriver.Chrome(executable_path="D:\chromedriver\chromedriver.exe")
driver.get("https://news.qq.com")
#了解ajax加载
for i in range(1,100):
time.sleep(2)
driver.execute_script("window.scrollTo(window.scrollX, %d);"%(i*200))