爬虫常见问题与解答

--题目--
(1) 列举python网络爬虫所引用的模块包,提取数据用到的模块(至少各2个)

  requests、urllib | jsonpath xpath beautifulsoup 


(2)浏览器请求某网站时,从输入到页面显示出来,描述一下请求过程

  1.敲域名回车
  2.查询本地的DNS缓存,以找到域名对应的主机IP地址(若有,则跳到4)
  3.查询远程域名根DNS,找到IP地址
  4.向远程IP地址的服务器发送请求(若请求失败且未经过2,则返回2,若再再次失败,返回错误代码)
  5.服务器响应请求,向用户发送数据
  6.浏览器对返回的数据进行处理(浏览器渲染)
  7.显示


(3) 爬虫在爬取数据,网站有反爬时如何解决

  通过headers反爬虫:解决策略,伪造headers
  基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为
  基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求

(4) 如果爬数据时ip被封了,如何解决

  1、放慢抓取速度,减小对于目标网站造成的压力。但是这样会减少单位时间类的抓取量。
  2、第二种方法是通过设置代理IP等手段,突破反爬虫机制继续高频率抓取。需多个稳定的代理IP


(5)如何解决登录时有验证码的问题,列出你知道的状态码(至少3个)

   一、筛选得到隐藏信息
    进入开发者工具(按F12),找到其中的Network后,手动的先进行一次登录,找到其中的第一个请求,在Header的底部会有一个data的数据段,这个就是登录所需的信息。如果想对其中的隐藏信息进行修改先获取网页Html的内容

  二、将信息进行提交
  找到源码中提交表单所需要的action,和method使用

  三、获取登录后的信息
  信息提交后模拟登录就成功了,接下来就可以获取登录后的信息了,如果有验证码,则提取其中的cookie,请求时携带cookie访问。

  状态码:
  200 OK:请求成功
  301 重定向所请求的页面已经转移至新的url。
  403 Forbidden — 对被请求页面的访问被禁止
  404 Not Found — 服务器无法找到被请求的页面
  500 Internal Server Error — 请求未完成。服务器遇到不可预知的情况
  504 Gateway Timeout — 网关超时


(6) 什么是进程 线程 协程

  进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
  线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
  协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。

  参考网址: https://blog.csdn.net/hairetz/article/details/16119911 


(7)自动化测试工具用什么包,如何使用有什么功能

  selenium+phantomJS 一个是自动化测试工具,一个是无界面的浏览器,他俩配合可以模拟一个用户
  鼠标点击浏览器的动作,从而在其中获取到相应数据


(8) scrapy中的pipeline 有什么作用

  pipeline(管道):它负责处理spider中获取item,并进行后期处理(如过滤,存储)


(9)模拟抓取某网站的第一页,输出匹配公告名字
  要求:网址:baseurl,匹配:title

  

import urllib.request 
import re 

def fetch(baseUrl): 

# 第1步:模拟浏览器发送请求 
data = urllib.request.urlopen(baseUrl).read() #二进制字节形式 
data = data.decode('utf-8') 

# 第2步:页面返回后,利用正则表达式提取想要的内容 
nameList=[] 
nameList = re.compile(r'target="_blank" title="(.*?)"',re.S).search(data) 

# 第3步:返回在页面上析取的“标题名” 
return nameList 

####### 执行 ######## 
if __name__ =="__main__": 

#要抓取的网页地址 
url = "http://www.sxszbb.com/sxztb/jyxx/001001/MoreInfo.aspx?CategoryNum=001001" 

#存放到名字列表中 
NameList = fetch(url) 

# 输出 NameList 
Length = len(NameList) 
for i in range(0, Length): 
print("标题名%d:%s\n"%(i+1, NameList[i]))

 

 

 

 

 

 

 


posted @ 2018-07-09 20:45  不止于python  阅读(1502)  评论(0编辑  收藏  举报