整理 爬虫面试题
添加 爬虫的代码
加深 爬虫的理解
版本 python3.6
1. 列举您使用过的Python网络爬虫所用到的网络数据包 requests urllib urllib2Python自带:urllib、urllib2,第三方:requests
2. 谈谈他们的区别或者优缺点 urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能。 urllib2:urllib2.urlopen可以接受一个Request对象或者url,(在接受Request对象时候,并以此可以来设置一个URL 的headers),urllib.urlopen只接收一个url。 urllib有urlencode,urllib2没有,因此总是urllib,urllib2常会一起使用的原因。 requests是一个HTTP库, 它只是用来,进行请求,对于HTTP请求,他是一个强大的库,下载,解析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现目前使用requests和scrapy框架比较多,问到自带库的比较少,一般了解就可以,主要是讲requests
3. requests返回的content和text的区别 response.text返回的是Unicode型数据(获取文本使用); 修改编码方式:response.encoding=”gbk” response.content返回的是bytes类型(获取图片,文件)。 修改编码方式:response.content.decode(“utf8”) 3. 为什么requests请求需要带上header 模拟浏览器,欺骗服务器,获取和浏览器一致的内容 header的形式:字典 用法: requests.get(url,headers=headers) 4. requests使用小技巧 reqeusts.util.dict_from_cookiejar 把cookie对象转化为字典 requests.get(url,cookies={}) 设置请求不用SSL证书验证 response = requests.get("https://www.12306.cn/mormhweb/ ", verify=False) 设置超时 response = requests.get(url,timeout=10) 配合状态码判断是否请求成功 assert response.status_code == 200 4. 使用requests写一个小爬虫import requests
from bs4 import BeautifulSoup
# 目标url
url = 'http://wx61a0054468aba354.shanhukanshu.com/shuku'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
#翻页操作
for i in range(1, 10000):
url_i = 'http://wx61a0054468aba354.shanhukanshu.com/shuku/{}//0/0/2/2.html'.format(i)
response_i = requests.get(url_i, headers=headers).text
# 判断最后一页
if response_i is None:
break
# 获取第i个页面的url、response类、html、soup,以及该页面所有图片对应的src
soup_i = BeautifulSoup(response_i, 'lxml')
data_list = soup_i.find('div',{'id':'bookList'})
# 二次筛选,获取所有a标签
for i in data_list.find_all('a'):
book_url = 'http://wx61a0054468aba354.shanhukanshu.com/' + i['href']
#print(book_url)
# 再次请求获取小说内容页
book_content = requests.get(book_url).text
# print(book_content)
soup = BeautifulSoup(book_content,'lxml')
# 小说名称
title = soup.find('h2', {'class':'line_2'}).text
#封面
#cover = soup.find('img',src = re.compile(r'^https://bfimg'))
src = soup.find_all('img')
cover = src[0].get('data-original')
# 作者
author = soup.find('span', {'class':'author'}).text
# 章节数
chapter_cnt = soup.find('pan', {'class':'nh_wap_fontcolor'}).text
# 字数
word_cnt = soup.find('span', {'style':'padding-left: 4px; padding-right: 2px; margin-left: 2px;'}).text
# 是否已完成,0连载中,1已完结
is_finished = soup.find('span', {'class':'nh_wap_fontcolor'}).text
if is_finished == '完本':
is_finished = '1'
else:
is_finished = '0'
# 所属分类,多个用,分开
cate_ids = soup.find('p',{'class':'classify'}).text
cate_ids_list = cate_ids.split()
cate_ids = cate_ids_list[0:-1]
for i in cate_ids:
cate_ids = i
# 介绍
desc = soup.find('div',{'class':'jianjie'}).text
# 添加时间
create_time = '0'
# 更新时间
update_time = soup.find('div',{'class':'time nh_wap_fontcolor'}).text
# print(cate_ids)
#把一本书的数据保存到一个列表中
book_list = []
book_list.append(title)
book_list.append(cover)
book_list.append(author)
book_list.append(chapter_cnt)
book_list.append(word_cnt)
book_list.append(is_finished)
book_list.append(create_time)
book_list.append(update_time)
book_list.append(cate_ids)
print(book_list)
#列表转为字符串写入文件中
book_str = ' '.join(book_list)
#保存数据
with open('shanhu.txt','a',encoding='utf-8') as f:
f.write(book_str)
f.write('\r\n')
基础模块主要是对requests模块提问比较多,功能还是比较完善,写一些小爬虫基本都用这个三方模块,面试话主要是这几个问题,当然自然是要掌握这个模块才能不变应万变,要从事爬虫和对爬虫有兴趣都必须要掌握这个模块的,下一篇我们讲一下爬虫解析库,未完待续…**