1.1 爬虫基本原理
爬虫是模拟用户(User),向服务器(Server)发送请求(Request),获取响应(Response)的程序(Program)。
1.2 请求(Request)
1.2.1请求方式
请求常用的方式有get与post方式
post常用于表单提交
1.2.2请求头
请求头包括提交请求的重要信息,常见字段有User-Agent,Refer, Proxy等
1.3 响应(Response)
获取响应的内容,解析以获取相应的信息。
响应码
- 200:响应成功
- 404:用户访问错误
- 500:服务器错误
1.4 代码演示(Demonstration)
import requests
url = 'https://blog.csdn.net/the_harder_to_love' # 我的博客主页
response = requests.get(url) # get method
# response = requests.get(url, data='夜是故乡明') # 加上参数data, post method
html = response.text # 获取网页内容
print(html)
1.5 正则表达式(Regular Expression)
正则表达式是字符串匹配的语言,是解析信息的一种方式。
推荐资料:
廖雪峰-正则表达式
菜鸟教程-正则表达式
以及练习正则表达式的学习工具:正则表达式在线测试
1.6 爬取豆瓣电影Top250案例
本人觉得用re解析html过于麻烦,所以使用PyQuery中CSS选择器完成信息解析,获取了 电影排名,电影名称,导演,主演,上映年份,国家,类型,评分,摘要信息,代码如下。
'''
爬取豆瓣电影Top 250
'''
import requests
from pyquery import PyQuery as pq
import time
BASE_URL = 'https://movie.douban.com/top250?start='
def get_movies():
movies = []
for i in range(0, 250, 25):
url = BASE_URL + str(i)
html = requests.get(url).text
doc = pq(html)
lis = doc('ol.grid_view li').items()
for li in lis:
# 电影排名
rank = li('div.pic em').text()
# 电影名称
info = li('div.info')
name = ''.join([item.text() for item in info('div.hd a span').items()])
name = ''.join(name.split()) # 去除所有空格
cnts = list(li('p').items())[0].text().split('\n')
# 导演,演员
humans = [item for item in cnts[0].split('\xa0') if item]
if len(humans) < 2:
director = humans[0]
starring = ''
director = director.replace('导演: ', '')
else:
director, starring = humans
director = director.replace('导演: ', '')
starring = starring.replace('主演: ', '')
# 上映年份,国家,类型
# 移除 空格符
year, country, types = (cnts[1].replace('\xa0', '').split('/'))[-1:-4:-1]
# 评星
star = li('div.star span.rating_num').text()
# 摘要
quote = li('p.quote').text()
# 电影排名,电影名称,导演,主演,上映年份,国家,类型,评分,摘要
movie = (rank, name, director, starring, year, country, types, star, quote)
print(movie)
movies.append(movie)
with open('douban_movies_top250.txt', 'w', encoding='utf-8') as f:
f.writelines(','.join(movie)+'\n' for movie in movies)
return movies
def count_spend_time(func):
start_time = time.time()
func()
end_time = time.time()
time_dif = (end_time - start_time)
second = time_dif%60
minute = (time_dif//60)%60
hour = (time_dif//60)//60
print('spend ' + str(hour) + 'hours,' + str(minute) + 'minutes,' + str(second) + 'seconds')
if __name__ == '__main__':
count_spend_time(get_movies)
1.7 爬取豆瓣电影Top250案例小结
豆瓣电影相关信息可以访问详情页,获取更加完整,全面的信息。