学习python爬虫(scrapy模块),首先准备python环境,安装第三方包scrapy
(mac环境可参考:https://blog.csdn.net/qq_42512064/article/details/80982470),准备好环境后,从第一个简单的爬虫程序开始吧!
一、简介:爬虫就是获取网页的数据,获取简单的数据容易,解析其中的数据拿到自己想要的却不那么容易,大家都知道网页是有很多元素组成:<div>、<p>、<h>、<a>等,每一种元素都有很多个,通过什么去识别这些元素呢,scrapy提供两种方式,xpath和css,从字面上理解,xpath就是通过元素在网页中的路径去识别元素(下表为xpath中路径表达式列表)。
二、爬淘宝的一丢丢数据
1、淘宝页面(爬取下图框框中的数据)
2、页面右键“查看源代码”
3、完整代码先贴在这里
#coding:utf-8 import urllib2 # import platform from scrapy.selector import Selector resp = urllib2.urlopen('https://www.taobao.com/', timeout=3) # my_os = platform.system() # print 'my_os: '+ str(my_os) # print 'resp info: '+ str(resp.info()) # print 'resp read: '+ str(resp.read()) subSelector = Selector(text=resp.read()).xpath('//div[@class="nav J_Nav clearfix "]') #主题市场 zhuti = subSelector.xpath('./h2/text()').extract() print 'zhuti: ' + zhuti[0].encode('utf-8') #天猫 tianmao = subSelector.xpath('./ul/li/a/text()').extract() print 'tianmao: ' + tianmao[0].encode('utf-8') #电器城 dianqicheng = subSelector.xpath('./ul[@class="nav-bd"]/li/a/text()').extract() print 'dianqicheng: '+ dianqicheng[1].encode('utf-8')
4、代码解读
1⃣️首先要打开网页,并且要用到scrapy的选择器,so需要导入urllib2和Selector两个模块;
import urllib2 # import platform from scrapy.selector import Selector
2⃣️打开淘宝网页,urlopen第一个参数为要打开网页的url,第二个参数为打开网页限制的超时时间,resp为打开网页的返回,这个值在后面解析数据中需要用到,resp中包含很多东西:访问网页的返回码如200、404、500等(通过resp.getcode()获得)、网页源代码(通过resp.read()获得)等;
resp = urllib2.urlopen('https://www.taobao.com/', timeout=3) # print 'resp info: '+ str(resp.info()) # print 'resp read: '+ str(resp.read())
3⃣️接下来解析数据,先获取页面’主题市场‘,text后即为网页源代码,页面中的div元素很多,首先在源代码中搜下‘主题市场’四个字,发现该网页中只有这一个,可以看到它包含在一个div中,div通过什么来识别呢,它的class(切记,class这种东西,从源代码中直接找到贴过来,引号中的完全不要改动,即使class的最后是一个空格),至于为什么用‘//’,可以看路径表达式列表;
subSelector = Selector(text=resp.read()).xpath('//div[@class="nav J_Nav clearfix "]')
4⃣️’主题市场‘又是一个h2元素,并且整个div中只有一个h2元素,则直接在当前路径(./)下找h2即可,extract()的返回值是一个列表,即使列表中只有一个字符串,所以要zhuti[0],这里‘主题市场’是中文,想要看到汉字,还得解码,so: encode();
#主题市场 zhuti = subSelector.xpath('./h2/text()').extract() print 'zhuti: ' + zhuti[0].encode('utf-8')
5⃣️想拿到’天猫‘,发现它在一个ul中的li中的a元素中,并且是这个div中的第一个ul元素,所以直接写路径即可;
#天猫 tianmao = subSelector.xpath('./ul/li/a/text()').extract() print 'tianmao: ' + tianmao[0].encode('utf-8')
6⃣️想拿到‘电器城’,它也在一个ul中的li中的a元素中,但是这个ul不是div中的第一个ul元素,于是要通过ul的class来区分,在源代码中找到电器所在ul的class,贴过来,而电器城是ul中的第2个li元素中的,于是取dianqicheng[1];
#电器城 dianqicheng = subSelector.xpath('./ul[@class="nav-bd"]/li/a/text()').extract() print 'dianqicheng: '+ dianqicheng[1].encode('utf-8')