专栏名称: 六月的雨
Android开发工程师
目录
相关文章推荐
肿瘤资讯  ·  齐鲁方案 ... ·  2 天前  
肿瘤资讯  ·  2025 ASCO GI | ... ·  2 天前  
51好读  ›  专栏  ›  六月的雨

Python写爬虫爬妹子

六月的雨  · 掘金  ·  · 2018-06-05 03:55

正文

最近学完Python,写了几个爬虫练练手,网上的教程有很多,但是有的已经不能爬了,主要是网站经常改,可是爬虫还是有通用的思路的,即下载数据、解析数据、保存数据。下面一一来讲。

1.下载数据

首先打开要爬的网站,分析URL,每打开一个网页看URL有什么变化,有可能带上上个网页的某个数据,例如xxID之类,那么我们就需要在上一个页面分析HTML,找到对应的数据。如果网页源码找不到,可能是ajax异步加载,去xhr里去找。

有的网站做了反爬的处理,可以添加User-Agent :判断浏览器

?
1 2 3 self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' # 初始化 headers self.headers = { 'User-Agent' : self.user_agent}

如果不行,在Chrome上按F12分析请求头、请求体,看需不需要添加别的信息,例如有的网址添加了referer:记住当前网页的来源,那么我们在请求的时候就可以带上。

下载数据的模块有urllib、urllib2及Requests Requests相比其他俩个的话,支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自 动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码,而且api相对来说也简单,但是requests直接使用不能异步调用,速度慢。 ?
1 html = requests. get (url, headers=headers)   #没错,就是这么简单

urllib2以我爬取淘宝的妹子例子来说明: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = { 'User-Agent' : user_agent} # 注意:form data请求参数 params = 'q&viewFlag=A&sortType=default&searchStyle=&searchRegion=city%3A&searchFansNum=&currentPage=1&pageSize=100' def getHome(): url = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8' req = urllib2.Request(url, headers=headers) # decode(’utf - 8’)解码   把其他编码转换成unicode编码 # encode(’gbk’) 编码  把unicode编码转换成其他编码 # ”gbk”.decode(’gbk’).encode(’utf - 8') # unicode = 中文 # gbk = 英文 # utf - 8 = 日文 # 英文一 > 中文一 > 日文,unicode相当于转化器 html = urllib2.urlopen(req, data= params ).read().decode( 'gbk' ).encode( 'utf-8' ) # json转对象 peoples = json.loads(html) for i in peoples[ 'data' ][ 'searchDOList' ]: #去下一个页面获取数据 getUseInfo(i[ 'userId' ], i[ 'realName' ])

2.解析数据

解析数据也有很多方式,我只看了beautifulsoup和正则,这个例子是用正则来解析的 ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def getUseInfo(userId, realName): url = 'https://mm.taobao.com/self/aiShow.htm?userId=' + str(userId) req = urllib2.Request(url) html = urllib2.urlopen(req).read().decode( 'gbk' ).encode( 'utf-8' ) pattern = re.compile( '<img.*?src=(.*?)/>' , re.S) items = re.findall(pattern, html) x = 0 for item in items: if re.match(r '.*(.jpg")$' , item.strip()): tt = 'http:' + re.split( '"' , item.strip())[1] down_image(tt, x, realName) x = x + 1 print( '下载完毕' )







请到「今天看啥」查看全文