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
原创粉丝点击