python爬虫(一)

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 BeautifulSoup
import requests
url='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 BeautifulSoup
import requests
url='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 requests
from bs4 import BeautifulSoup
#模拟iphone
headers={
    '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.gif
http://cc.ddcdn.com/img2/x.gif
http://cc.ddcdn.com/img2/x.gif
http://cc.ddcdn.com/img2/x.gif

心好痛。。
在不考虑图片是否正确的情况下,下面的代码展示如何爬取网站所有页数的信息:

from bs4 import BeautifulSoup
import requests
import 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值