我的第一个Python爬虫

2018-06-18 01:49:32来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

零基础学习Python,学习的时间加起来有一个多月了,作为一个没有学过编程语言,只懂if语句的初学者,刚开始学习的时候看懂语法花了不少时间,语法基本没问题之后又发现有好多第三方库,这学起来真的是从入门到入坟。后来发现爬虫挺好玩的,经过不懈努力,死了不少脑细胞,在做其他事的时候还在想代码,在这样的状态下终于写出了第一个爬虫并成功抓取了数据,虽然代码很烂(烂到不敢看),但还是想记录下来,让以后的自己看看以前的自己多么水!

这个爬虫要爬的是某生鲜品牌在天猫旗舰店上的所有商品信息(包括商品名称、价格、销量和评价),在Chrome上打开网站,在商品名那个使用检查,看到是在一个<a>标签中,复制商品名称到网页源代码中查找发现没有结果,尝试了一下价格也是一样没有结果,说明这些信息都是通过js异步加载的。这时就切换到network,重新载入页面,再去type是xhr、JavaScript、json的项逐项查看,终于在一个xhr的headers里看到一个与原网址相似但多了一些东西的url,多的东西估计是该旗舰店的店铺id,尝试打开url,发现是一个没有图片,排版也很简单的网页,源代码里也有商品信息,OK,这就是要爬取的真正目标。这里也尝试了把url里一些信息比如callback、json等去掉,只留下id有关信息,有两个id相关,一个mid,一个wid,分别去试,发现店铺id是mid,即只留下mid信息,网页也能成功打开。

然后开始写代码,用到的库有requests、BeautifulSoup、csv,

1 import requests
2 from bs4 import BeautifulSoup
3 import csv
4 
5 wb_data = requests.get(url)
6 soup = BeautifulSoup(wb_data.text, 'lxml')

运行,出错,错误原因:HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.

被重定向了,考虑要加入headers,对要爬取的网页检查,切换到network,重新载入,去复制里面headers里的user-agent和cookie信息,这样就可以伪装成浏览器在发送request,添加了headers之后重试,print(soup)可以得到网页源代码。

接下来要定位商品信息,对商品名称检查,在<a>标签中,copy selector,在查找里粘贴,去掉前面部分,只留下父级标签,共有39条搜索结果,与网页上商品数目一致

 

 

1 name_list = soup.select('dd.\5c \22 detail\5c \22 > a')

运行,出错,错误原因:不规范的selector,考虑是\"detail\"这里的问题,于是使用soup.select('dd.\"detail\" > a'),还是不行,不知道怎么处理\“”这样的特殊字符,试过正则,soup.find(),都不行,没辙了就想不写css样式了,只用标签dd > a,先查找,发现39条搜索结果,与之前一样,对于这样数据少的网页竟然被我取巧了(汗颜,水平太次)。同样的方法来定位其他信息,价格用的是div > span,查找到117条,正好39的3倍,仔细看第一个span标签文本是¥,第二个是价格,第三个是销量,这样使用list的切片功能就可以分别得到价格和销量的信息了。再查找评价,h4 > a > span,找到29条,回网页看了下,发现39天商品信息里最后10条是本店推介,即共有29件商品,10件推介,没有关系,后面使用zip函数可以去掉不对称的10条信息。

1 name_list = soup.select('dd > a')
2 price_list = soup.select('div > span')[1::3]
3 salenum_list = soup.select('div > span')[2::3]
4 evaluatenum_list = soup.select('h4 > a > span')

最后把数据导入csv

1 writer = csv.writer(open('', 'w', newline=''))
2 field = ('商品名称','价格','销量','评价数')
3 writer.writerow(field)
4 for name,price,salenum,evaluatenum in zip(name_list,price_list,salenum_list,evaluatenum_list):
5     row = (name.text,price.text.strip(),salenum.text,evaluatenum.text)
6     writer.writerow(row)
newline=''是为了csv里没有空行,strip()去掉价格文本里的空格,运行,打开csv文件,看到里面有29条商品信息,第一个简陋的爬虫完成。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:python的内存管理机制

下一篇:Python 学习笔记(七)Python字符串(二)