python爬虫(一)
来源:互联网 发布:java json与xml转换 编辑:程序博客网 时间:2024/06/11 13:10
python爬虫(一)
注:本文仅供学习,不作任何商业用途。感谢麻瓜,感谢公爵。
前提和准备:
1.需要了解服务器与本地的交换机制,如http协议、request、response等,request是我们向服务器提交的请求信息,response是服务器将我们的请求进行解析后回馈的信息。在http1.0时代,request主要有get和post向服务器请求的方法,在http1.1时代增加了几种方法,如head、put、options等,但是最常见的还是get和post方法。本文以get为例。
2.使用chrome浏览器
3.python版本3.4+
4.爬取网站:猫途鹰(英文名:tripadvisor)
下面转入正式的爬虫部分。
第一步:测试一下看能否解析出数据,代码如下:
from bs4 import BeautifulSoupimport requestsurl='http://www.tripadvisor.cn/Attractions-g298566-Activities-oa30-Osaka_Osaka_Prefecture_Kinki.html'wb_data=requests.get(url)soup=BeautifulSoup(wb_data.text,'lxml')print (soup)
结果如下(结果只截取一部分):
ta.plc_hotels_redesign_header_0_handlers = ta.p13n.placements.load('hotels_redesign_header','handlers.js', { 'name': 'hotels_redesign_header', 'occurrence': 0, 'id': 'taplc_hotels_redesign_header_0', 'location_id': 298566, 'servletName': 'Attractions','servletClass': 'com.TripResearch.servlet.attraction.AttractionOverview', 'params': {}});if (ta.prwidgets) {ta.prwidgets.initWidgets(document);}/* ]]> */</script><div id="IP_IFRAME_HOLDER"></div></body><!-- st: 560 dc: 0 sc: 10 --><!-- uid: WFYokH8AAAEAAK5uol0AAAA2 --></html>Process finished with exit code 0
结果说明,网页被成功解析。
第二步:从解析成功的内容中截取需要的信息,如图片,标题等。以下是获得标题和图片以及标签的地址:
from bs4 import BeautifulSoupimport requestsurl='http://www.tripadvisor.cn/Attractions-g298566-Activities-oa30-Osaka_Osaka_Prefecture_Kinki.html'wb_data=requests.get(url)soup=BeautifulSoup(wb_data.text,'lxml')titles=soup.select('div.property_title > a[target="_blank"]')imgs=soup.select('img[height="160"]')cates=soup.select('div.p13n_reasoning_v2')for title,img,cate in zip(titles,imgs,cates): data={ 'title':title.get_text(), 'img':img.get('src'), 'cate':list(cate.stripped_strings), } print (data)
运行结果如下(截取一部分结果):
{'cate': ['大型购物中心'], 'img': 'http://cc.ddcdn.com/img2/x.gif', 'title': '地下商店街'}{'cate': ['区域'], 'img': 'http://cc.ddcdn.com/img2/x.gif', 'title': '美国村'}{'cate': ['圣地与宗教景点'], 'img': 'http://cc.ddcdn.com/img2/x.gif', 'title': '难波八阪神社'}
从结果可以看出来,所有的图片链接都是一样的,因为网站采取了反爬策略。
下面将对代码进行修改,尝试实现爬取真实图片地址(最终失败哈哈哈)。尝试方法:在浏览器上模拟手机登陆,手机的反爬策略可能没有那么完善,爬取图片代码如下:
import requestsfrom bs4 import BeautifulSoup#模拟iphoneheaders={ 'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'}url='http://www.tripadvisor.cn/Attractions-g298184-Activities-oa90-Tokyo_Tokyo_Prefecture_Kanto.html#ATTRACTION_LIST'mb_data=requests.get(url,headers=headers)soup=BeautifulSoup(mb_data.text,'lxml')imgs=soup.select('div.thumb.thumbLLR.soThumb > img')for img in imgs: print (img.get('src'))
结果依然是:
http://cc.ddcdn.com/img2/x.gifhttp://cc.ddcdn.com/img2/x.gifhttp://cc.ddcdn.com/img2/x.gifhttp://cc.ddcdn.com/img2/x.gif
心好痛。。
在不考虑图片是否正确的情况下,下面的代码展示如何爬取网站所有页数的信息:
from bs4 import BeautifulSoupimport requestsimport time#此网站页面数是30的倍数,我所爬取的日本相关景点有90页左右。urls=['http://www.tripadvisor.cn/Attractions-g298184-Activities-oa{}-Tokyo_Tokyo_Prefecture_Kanto.html#ATTRACTION_LIST'.format(str(i)) for i in range(30,2730,30)]#为避免反爬,设置请求间隔为3秒,也可以用random使请求间隔是非固定的。def get_items(url,data=None): wb_data=requests.get(url) time.sleep(3) soup=BeautifulSoup(wb_data.text,'lxml') titles=soup.select('div.property_title > a[target="_blank"]') imgs=soup.select('img[height="160"]') cates=soup.select('div.p13n_reasoning_v2') for title,img,cate in zip(titles,imgs,cates): data={ 'title':title.get_text(), 'img':img.get('src'), 'cate':list(cate.stripped_strings), } print (data)for url in urls: get_items(url)
今天就到这里,下次看看能不能把图片的问题解决。。。
0 0
- Python爬虫(一)
- Python爬虫(一)
- python爬虫(一)
- Python爬虫(一)
- python爬虫(一)
- python爬虫(一)
- python爬虫(一)
- python爬虫(一)
- python爬虫(一)
- Python 爬虫(一)
- python 爬虫(一)
- python爬虫(一)
- 【网络爬虫】【python】网络爬虫(一):python爬虫概述
- python爬虫系列(一):爬虫简介
- Python爬虫整理(一)
- python网络爬虫(一)
- python爬虫学习(一)
- Python爬虫(一):基本概念
- 关联关系映射——一对一关联
- 桃心
- java中的数据类型及转换形式
- mysql开启远程登录权限
- 深入理解Java:注解(Annotation)自定义注解入门
- python爬虫(一)
- 初来乍到,先打个招呼,以后再更新其他文章
- 1017
- C#回调函数,事件
- Java语言基础(六)之 —— 循环结构(for循环)
- CE中地址列表中绿色地址与黑色地址的含义
- 【微信小程序】开发者工具下载安装及创建项目功能预览
- The JVM Architecture Explained
- C++多态中的构造函数与析构函数