打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python爬虫经典案例,看完这一篇就够了

urllib2

urllib2是Python中用来抓取网页的库,urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用)
在python2.x里面有urllib和urllib2;在python3.x里面就把urllib和urllib2合成一个urllib;urllib3是在python3.x了里面新增的第三方扩展。
urllib2 官方文档:
https://docs.python.org/2/lib...

urllib2 源码:
https://hg.python.org/cpython...

urllib2 在 python3.x 中被改为urllib.request

来先看一个简单的Demo,通过请求访问百度

# 向指定的url地址发送请求,并返回服务器响应的类文件对象response = urllib.request.urlopen('http://www.baidu.com/')# 服务器返回的类文件对象支持Python文件对象的操作方法# read()方法就是读取文件里的全部内容,返回字符串html = response.read()# 打印响应内容print(html)</pre>

我们已经拿到百度的首页了,但是目前出现了第一个问题就是,当你使用urllib2去访问的时候,它的User-Agent是Python-urllib/3.6 (user-agent决定用户的浏览器)

我们需要稍微伪装下,要不然第一步就会被反爬虫发现

#!/usr/bin/env python# -*- coding:utf-8 -*-import urllib.request# urllib2 的User-Agent: Python-urllib/2.7# User-Agent 爬虫和反爬虫的第一步ua_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'}# 通过urllib.request.Request() 方法构造一个请求对象request = urllib.request.Request('http://www.baidu.com/', headers = ua_headers)# 向指定的url地址发送请求,并返回服务器响应的类文件对象# urllib.request.urlopen()参数即可以是字符串也可以是对象response = urllib.request.urlopen(request)# 服务器返回的类文件对象支持Python文件对象的操作方法# read()方法就是读取文件里的全部内容,返回字符串html = response.read()# 返回 HTTP的响应码,成功返回2004服务器页面出错,5服务器问题print(response.getcode())# 返回 返回实际数据的实际URL,防止重定向问题print(response.geturl())# 返回 服务器响应的HTTP报头print(response.info())# 打印响应内容#print(html)

爬取百度贴吧

在url后面直接拼接参数,这种请求方式为get请求

#!/usr/bin/python#coding:utf-8from urllib import request,parsedef loadPage(fullUrl,filename): ''' 作用:根据url发送请求,获取服务器响应文件 url: 需要爬取的url地址 filename : 处理的文件名 ''' print('正在下载' + filename) headers = {'User_Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'} # 构造请求对象 request1 = request.Request(fullUrl,headers = headers); return request.urlopen(request1).read()def wirtePage(html,filename): ''' 作用:将html内容写入到本地 html:服务器相应的文件内容 ''' print('正在保存' + filename) #文件写入 with open(filename,'w') as f: # 此时打印的html伪bytes格式的,f.write()参数需要字符串 f.write(html.decode(encoding='utf-8')) print ('-' * 30)def tiebaSpider(url,beginPage,endPage): for page in range(beginPage,endPage+1): pn = (page-1) * 50 filename = '第' + str(page) +'页.html' fullUrl = url +'&pn='+str(pn) # 发起请求 html = loadPage(fullUrl,filename) print(html) # 写网页 wirtePage(html,filename)if __name__ == '__main__': kw = input('请输入爬去的贴吧名:') beginPage = int(input('请输入起始页:')) endPage = int(input('请输入结束页')) url = 'http://tieba.baidu.com/f?' key = parse.urlencode({'kw':kw}) fullUrl = url + key tiebaSpider(fullUrl,beginPage,endPage)

通过POST请求到有道翻译

有些网站的查询传参不是直接在URL上面拼接而且通过post form data进行,这个时候传递就要模拟post请求

from urllib import request,parse# 通过抓包的方式获取的url,并不是浏览器上显示的urlurl = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'# 完整的headersheaders = {        'Accept' : 'application/json, text/javascript, */*; q=0.01',        'X-Requested-With' : 'XMLHttpRequest',        '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',        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8',    }# 用户接口输入key = input('请输入需要翻译的文字:')# 发送到web服务器的表单数据formdata = {'from' : 'AUTO','to' : 'AUTO','smartresult' : 'dict','client' : 'fanyideskweb','type' : 'AUTO','i' : key,'doctype' : 'json','keyfrom' : 'fanyi.web','ue' : 'UTF-8','version':'2.1','action' : 'FY_BY_CLICKBUTTON','typoResult' : 'false'}# 经过urlencode转码data = parse.urlencode(formdata).encode('utf-8')print(data)# 如果Request()方法里的data参数有值,那么这个请求就是POST# 如果没有,就是Getrequest1 = request.Request(url, data = data, headers = headers)print(request.urlopen(request1).read().decode('utf-8'))

抓取ajax豆瓣电影

有些时候页面上面是空的,内容通过ajax来加载,那么我们爬虫需要关注点就应该到数据源这个位置,ajax加载的页面,数据源一定是json,拿到json也就拿到了数据

from urllib import request, parseurl = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action'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'}formdata = { 'start':'0', 'limit':'20' }data = parse.urlencode(formdata).encode('utf-8')request1 = request.Request(url, data = data, headers = headers)print(request.urlopen(request1).read().decode('utf-8'))
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
「爬虫教程」第一章:python爬虫基础教程
Python做简单爬虫(urllib.request怎么抓取https以及伪装浏览器访问的方法)
使用python urllib进行网页爬取
【Python必学】Python爬虫反爬策略你肯定不会吧?
Python爬虫日记一:爬取豆瓣电影中速度与激情8演员图片
python两种方法进行网络爬虫-urllib2、tornado
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服