爬取动态网页
新手入门学习爬虫,一般都是从爬豆瓣开始的。在我学会爬豆瓣后,想要爬其他网页玩玩,然后我就选取了爬取猫眼电影。像是豆瓣一样,我们进入猫眼电影,我们查看源代码,是可以看到很多我们想要的东西的,但是,用requests解析后,里面什么都没有。刚开始还以为我搞错了,然后问了别人才知道,这原来是动态网页,是需要浏览器浏览,或者是鼠标发生移动后才才会生成HTML代码的。因此,为了能够顺便爬取到我们需要的信息,需要我们借助工具来模仿用户的行为来生成HTML代码。
解析网站
在解析网站中,用的是requests库来访问,用Xpath或者BeautifulSoup来解析也都是可以的。
import requests
import lxml
from bs4 import BeautifulSoup
def get_one_page(url):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
response=requests.get(url,headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
titles = soup.find_all('title')
print(titles)
# if response.status_code==200:# 状态响应码为200 表示正常访问
# return response.text
# return None
def main():
url='https://maoyan.com/board/4?offset=0'
html=get_one_page(url)
# print(html)
main()
通过上述代码解析后,发现并没有我们需要的内容
最后一样显示了</script><script src="/public/js/verify.e92127.js" type="text/javascript"></script></body></html>
解析不出什么东西,应该是采取了Javascript来动态生成信息,所以,我又学习动态Javascript的抓取教程。
在Python中用Selenium执行JavaScript
Selenium是一个强大的网页抓取工具,最初是为网站自动化测试而开发的。Selenium可以让浏览器自动加载网站,获取需要的数据,甚至对网页截屏,或者判断网站上是否发生了某些操作。
安装iSelenium
首先安装Selenium
pip install Selenium
下载PhantomJS
安装完成后,我们还需要安装PhantomJS。因为是一个功能完善(虽无开头)的浏览器,并非一个python库,所以不能pip安装
浏览器输入https://phantomjs.org/download.html
根据需要自行下载,下载完成后解压,将解压包内bin文件夹添加至环境变量
driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
driver.get('https://pythonscraping.com/pages/javascript/ajaxDemo.html')
time.sleep(3)
print(driver.find_element_by_id('content').text)
driver.close()
'''
Here is some important text you want to retrieve!
A button to click!
'''
测试完成后,即可完成安装。
网页爬取
我们设置了等待时间,因为需要等Javascript完全加载才可以获取全部信息。
代码如下:
from selenium import webdriver #引入网页驱动包
import time
from selenium.webdriver.remote.webelement import WebElement
from selenium.common.exceptions import StaleElementReferenceException
def waitForLoad(driver):
elem = driver.find_element_by_tag_name("html")
count = 0
while True:
count += 1
if count > 20:
print('Timing out after 10 seconds and returning')
return
time.sleep(.5)
try:
elem == driver.find_element_by_tag_name('html')
except StaleElementReferenceException:
return
driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
url='https://maoyan.com/board/4?offset=0'
driver.get(url)
waitForLoad(driver) #等待网页JavaScript加载完成
print(driver.page_source)
driver.close() #最后要将driver关闭
网页html的部分截图。
电影成功爬取,就和爬取豆瓣一样即可。代码参考《Python网络爬虫权威指南》