在入手这个爬虫项目之前,基础知识的储备包括:
Python基础知识
网页信息呈现方式(HTML/JSON)
数据获得方式(POST/GET)
Requests,唯一的一个非转基因的Python HTTP库
获取我们需要的内容(正则表达式/Beautiful Soup 4.4.0文档)
《精通正则表达式(第三版)【美】弗瑞德》是本好书,第三章开始就有点傻眼了,还需要在未来写正则表达式时反复翻阅。
上述标粗内容是我在写爬虫过程中需要反复学习与查阅的内容。
项目开始
对于我这一个弱渣小白来说,实际上是边抄边思考并且进行总结与重现的一个过程。
豆瓣电影TOP250
有样学样豆瓣影片TOP250
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""豆瓣电影TOP250"""
"""
注意:
打开Chrome的开发者工具(https://developers.google.cn/web/tools/chrome-devtools/),来观察网页结构
在Windows和Linux,对应的快捷键是"F12"
"""
import codecs #更方便处理中文编码的编码解码器,在添加之前,控制台返回内容不是中文,是编码
import requests
from bs4 import BeautifulSoup
DOWNLOAD_URL = 'https://movie.douban.com/top250'
def download_page(url):
"""下载网页源码"""
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
}
# 服务器通过校验请求的U-A来识别爬虫,这算是最简单的一种反爬虫机制了
# 通过模拟浏览器的U-A,能够很轻松地绕过这个问题
# 不加header,返回b''
data = requests.get(url,headers=headers).content
#获取某个网页.全部内容
return data
def parse_html(html):
"""解析网页示例,获得电影名"""
soup = BeautifulSoup(html , features="lxml")
# 如果不写,就是No parser was explicitly specified
movie_list_soup = soup.find('ol' , attrs = {'class': 'grid_view'})
movie_name_list = []
for movie_li in movie_list_soup.find_all('li'):
detail = movie_li.find('div' , attrs = {'class' : 'hd'})
movie_name = detail.find('span' , attrs = {'class' : 'title'}).getText()
movie_name_list.append(movie_name)
"""让它找到页码导航中的下一页的链接"""
next_page = soup.find('span' , attrs = {'class' : 'next'}).find('a')
if next_page:
return movie_name_list, DOWNLOAD_URL + next_page['href']
return movie_name_list, None
def main():
#"""将获取到的内容全部打印出来"""
"""程序拼装,并将结果输出到一个文件中"""
url = DOWNLOAD_URL
with codecs.open('D:/practice/python_codes/Web_Scraping_with_Python/movies.txt','wb',encoding= 'utf-8') as fp:
while url:
html = download_page(url)
movies, url = parse_html(html)
fp.write(u'{movies}\n'.format(movies = '\n'.join(movies)))
#print (download_page(DOWNLOAD_URL))
if __name__ == '__main__':
"""主函数"""
main()
下一步,将基于此开展中文影视知识图谱构建研究。