scrapy 网页抓取时的定位问题

  • Post author:
  • Post category:其他


最近在做一个简单的静态网页内容抓取程序,在抓取过程中总是遇到定位不准确,数据返回值为空列表或者抓了一大堆非目标信息的问题,让我头疼不已。思考之后,就想着做一个简单的归纳总结,以便以后抓取网址时提高效率。


1.链接命名方法

要做好准确网页数据的定位,首先我认为要搞明白网页数据位置的命名方法。这边以中关村的某个页面控制台为例

可以看到这个页面上所有的链接都有特定的标签项。方便起见,我就按颜色把标签分类命名,紫色的叫头标签,黄色的是叫属性标签,蓝色的就叫内容标签。

所有的头标签都是可以点开的,里面富含了许多不同的分类,头标签的后面会跟上一个属性标签,属性标签后面是内容标签,他们的关系是从大到小逐级递减的。就好比妈妈要找五年级三班的小明回家吃饭,那么她应该先来到五年级楼层(div=5),点开,好一共5个班级,然后再找三班(class=3),最后再大喊小明的名字(a[contains(text(),”小明’]),找到相应对象。


2.地址查询方法总结

地址查询方法根据具体情况而不断变化,在几天的编程过程中,我主要运用了五种查询方法,我把它们大致分为两类:直接法和间接法。

1)、直接法:xpath、@id、@class、@name等

直接法顾名思义,就是直接准确地指出所查找对象的标签,从而精确定位。这种方法比较直观简单,便于查找和编译者在编程过程中检查所定位的网址链接是否存在错误。但是直接法也有其局限性或者说是先决条件,因为每个链接所对应的xpath都是不同的,因此如果想要抓取的数据前后xpath发生了改变,那么就不能使用xpath法定位。再者,某些链接的属性标签可能相同,如:

“@class=jd_1234/li/span/“屏幕大小””和“@class=jd_1234/li/span/a/”屏幕材质””

那么在使用@class=jd_1234的时候就要谨慎,如果不后续追加其他查找条件,可能就会多抓取到结果。

当然使用xpath时还有一点好处,就是可以一下子抓取到相同类似标签的所有数据。如果我们想要获得“…../li[1]/a”~”…./li[9]/a “的数据,在记事本 copy xpath后发现,li列表下的数据刚好只有1~9,那么我们也就不用一个个输入XPath,可以直接输入“…./li/a ”,这样就获得所有li[]里的a标下的值。这个方法在依次获取整块数据的情况下非常实用。

2)、间接法: 直接查找法、contains语句

还是拿小明同学举例子,如果现在已知小明在五年级三班,从他们班个子最高的那个同学的位子向前数三位就是小明的位子。好那我们现在要找小明就多了一种方法,我们可以先找到小明班级里那个个子最高的同学所在的那一列 ,然后从他开始向前数三个,就找找到了小明的位子。这种不直接查找目标对象具体标签而先查找相对目标的方法就是间接法。这个例子中,“个子最高的同学“就相当于一个内容标签,起到定位的作用。(seats in lines /contains[text (),”the highest student “]/front three —>小明)

可能有人会问,我既然都已经知道了小明的名字,为什么不直接搜索,而要采用这么一种复杂的方法来定位呢?一般来说,间接式的查找方法适用于两种情况:   1、属性标签重复 2、网页链接后缀变化    还是刚刚那个例子,假设说五年级三班里现在有五个小明,那么现在”小明”这个内容标签就不具备唯一性,所以@name查找无效。又假设说小明很调皮,每天早上出门都要换一个名字,今天叫小张,明天叫小吴,但他在学校的位子始终不变,那么我们还是可以通过间接法定位到小明的位置。间接法同样还适用于表格中的对应关系,通过项目名称查找到对应的内容。

3)、查找方法的逻辑组合

当我们想要一次性查找多个条件的目标对象时,就需要使用逻辑组合。如找出班级里所有姓“王”和姓“李”的同学,显然一个xpath和@name不能解决两个条件。这时候用逻辑连接符and、or、not来连接两个条件(@name[contains(text =”王”)and  contains(text =”李”))



版权声明:本文为ding810原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。