前面分享过《初学者必备|Python环境安装、第三方库的下载安装方法》,今天分享一个Python爬取网页中动态生成的内容的方法。
关键词:爬取动态生成的网页内容
一、简单类型:网页内容可直接获取
这种情况相对比较简单,爬取步骤:
1、用urllib.request库直接获取网页源码
2、用re库解析出需要的网页内容
3、对解析出的内容进行相关操作,比如下载
实例:爬取某贴吧中的图片,下为贴吧的部分截图
获取网页源码的源码:网页代码较大,建议不要打印。
右键,查看网页源代码,找到图片的地址,用re的正则表达式解析所有的图片地址。
技巧:可以在图片上右键,复制图片地址
在网页源代码页面用Ctrl+F调出搜索窗口,粘贴地址就可以快速定位到图片的地址处。
通过对比发现,网页中的图片地址都有统一的前缀和统一的后缀,如下图:
这个时候就可以用正则表达式获取地址了,正则表达式相对比较复杂,初学者只需要 理解二点就可以了,1、内是要获取的内容,左边是内容的前缀,右边是内容的后缀。2、.+?代表任意内容
最后一步,逐个下载获取的图片。
部分爬取结果:
源码:
import urllib.request
import re
url="http://tieba.baidu.com/p/2256306796" #网址
page=urllib.request.urlopen #获取网页
html=page.read #获取网页源码
# 解析jpg图片url的正则表达式
jpgReg = re.compile" width')
# 注:这里最后加一个'width'是为了提高匹配精确度
# 解析出jpg的url列表
jpgs = re.findall)
i=0
for jpgurl in jpgs:
urllib.request.urlretrieve+".jpg")
i=i+1
二、复杂类型:网页完整内容是动态生成的
在实际爬取的过程,会碰到上面的爬取方法失效的情况。因为有些网站的内容是用JS脚本动态生成的,这时候获取的网页源码中并不包含动态生成的内容。以某个英语学习网为例,网页源代码中并不明显包含网页的内容。
这时候就需要祭出Selenium了,Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。简单的说就是Selenium可以模拟访问网页,并获得最终的结果。使用Selenium之前还要安装有一个webdriver驱动文件,下载好Chrome驱动文件chromedrive.exe后,可以直接放在谷歌浏览器的安装目录下。
C:UsersAdministratorAppDataLocalGoogleChromeApplication
下载的时候,一定要下载自己谷歌浏览器的对应版本。下载地址如下:
这时候爬取的思路就要进行调整:
1、利用Selenium访问网页,获得动态生成的网页源代码
2、在源代码中找到需要的内容的格式并解析,然后下载。
这里边涉及到一个小技能,如何查看动态网页的源码:
方法就是右键里的检查功能。
选中右边的Elements标签页,就可以看到网页的全部真实源代码。
鼠标在右边的代码上移动,左边就会选中对应的内容块,非常直观。
找到自己需要的内容块后,展开右边的代码。
调整后的源码如下:
执行过程出现一个黑色的窗口就表示成功调用
爬取的部分内容列表截图,这个地址前要加上网站的前缀拼成完整的地址,进行二次爬取。
源码:开头的#要去掉,不然程序出错。不加上我就违规了
#import urllib.request
#import re
import time #sleep函数
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
url="不能加的" #网址
#page=urllib.request.urlopen #获取网页
#html=page.read #获取网页源码
contents=[] #保存获取的音乐地址列表
#初始化webdriver
global driver
chrome_options = Options
chrome_options.add_argument
chrome_options.add_argument
driver_path = 'chromedriver.exe' #这里放的就是下载的driver本地路径
driver = webdriver.Chrome
driver.get #打开网址
#等待4秒钟,视网速和网页内容而定
time.sleep
html = driver.page_source # 获取获取网页源码
#设置正则表达式规则,并解析
mp3Reg = re.compile" class=') # 注:参看上面的截个图
contents.extend.decode))
for mp3url in contents:
print #这里只是简单打印,实际还要再解析一次获得mp3真实地址
# 关掉driver
driver.quit
后记:以上就是Python爬取网页内容二种方法,不足之处欢迎留言讨论交流。
码字不易,您的关注、转发、收藏都会给我无限动力!