Python面试题之爬虫(基础模块)

爬虫

知识点:
  • 整理 爬虫面试题

  • 添加 爬虫的代码

  • 加深 爬虫的理解

  • 版本 python3.6


1. 列举您使用过的Python网络爬虫所用到的网络数据包

  • requests
  • urllib
  • urllib2

Python自带: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模块提问比较多,功能还是比较完善,写一些小爬虫基本都用这个三方模块,面试话主要是这几个问题,当然自然是要掌握这个模块才能不变应万变,要从事爬虫和对爬虫有兴趣都必须要掌握这个模块的,下一篇我们讲一下爬虫解析库,未完待续…**
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭郭郭二蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值