Python写小爬虫时遇到的问题记录

很早就知道python了,但一直没拿来用,最近突然觉得需要爬一些小图片(=_=)了,就想到了python。python用起来确实方便快捷,很快就构建好了主要功能。模块分2部分,一个是爬图模块,另一个是登录模块。爬一般网站就直接调爬图模块,爬xxx网站(+_+)就执行登录模块(嵌入了爬图模块),爬不同的xxx网站需要构造不同的formdata。

在陆续完善各种检测功能的时候遇到些问题,代码就不贴了比较长,主要耗在了通用性适配、错误处理上,都是细节问题,而核心代码都能搜到,此文记录下问题就行了。


爬图模块的问题:

1、正则匹配的问题(不完美解决),正则为r'img src="(.+?\.(jp(e)?g|png|bmp))"',能匹配出图片,但findall出来的imglist中会由于有选择符号“|”而多出单“jpg”等后缀,在遍历读取时只能用url[0]来指定完全url。理想状态为正则直接找出url的list,不带任何多余信息。


2、本地保存路径有中文的问题(不完美解决)。问题为

path = '/Users/xxx/Pictures/asdasd/中文'
os.mkdir(path)
就报错,加# -*- coding:utf-8 -*-或reload sys也没用,要print中文路径时加前面2个是有用的。但先os.mkdir('/Users/xxx/Pictures/asdasd/'),再os.mkdir('/Users/xxx/Pictures/asdasd/中文'),就可以。网搜了很久都找不到解决方法,暂时先用2次mkdir的方法凑合。


登录模块的问题。直接爬目标url返回的是login页面而拿不到目标url,所以要模拟登录:

1、暂时都解决了。因为登录只要用户名和密码,没有验证码,所以还算简单。爬取要cookie的网站时,构造opner先登录一次,之后再用此opener来open的请求就是带cookie的了。

在抓取登录链接(直接用chrome的右键检查功能)、提交表单data(检查或者wireshark抓包都行)的时候还是颇费了番功夫(功夫都费在熟悉流程熟悉工具上了),结果还算不错。chrome的检查功能挺不错,在构造表单链接时差点就要装Mono+fiddler了,还好检查功能找到了formdata,用构造data的方式post提交就行了。否则又是工具的调试适配,能搞疯人。wireshark当然也挺好,但在http协议表现格式上还是不如chrome专业。


最后,为了能直接./执行,又折腾了下shell,终于可以方便的获取pic了+_+。

------------------------------------------------


另,以下是爬本地路由器已登录客户端列表的问题及感想。

其实最开始就是想爬路由客户端,无奈网上全是爬图片的,于是做了个爬图。既然已经有了上面的功夫,那么下面就很轻松了。不过还是将问题记录下:

1、登录后再次登录,可能会出现重复登录的错误。受上面爬图经验的影响导致每次请求都带cookie,而这个路由器在登录成功后会保存登录用户,所以怪不得发login请求时经常错误但偶尔会返回token,python打印的异常又只打http 400,用chrome搞了挺久不知道啥原因,后来用wireshark抓包一下就明白了,在400的返回包里面夹带了额外信息说登录重复了,而chrome抓到的返回包是没有打印这个信息的只有400的错误。所以工具还真是有时这个好有时那个好,就像上面构造表单时wireshark就不如chrome直白了。登录成功主要就是为了要那个token,有了这个就可随便调用了。


2、请求的返回值不一定是html,也可是json或其他data。路由的ui是输入密码后弹出一个客户端列表会话框,当时还是按老规矩想找会话框的代码,找了半天发现就是一个表格,数据还是空的。又查了半天才发现客户端会话框不是登录按钮直接调用,而是登录成功后路由自动调用,当然,要人为输入密码成功后路由才会自动调用。所以找了这个/api链接后,再提交抓到的行为字符串和token,就能得到各种想要的结果了,格式是json。转化为字典后,写个递归就把各字段值都提取出来了。


综上:

1、爬东西时header并不太重要,随便塞几个字段就行,一般塞user agent,有时甚至不构造完全为空也能登录。formdata就比较重要了,而构造的格式根据chrome抓到的形式完全复制一份就行,基本各个formdata形式都不一样,有的还要提交一些莫名的数据,反正照单复制就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值