python爬虫--xpath方式清洗数据,清洗失败?(class内容中有空格)
目标:爬取类似下图中帖子的图片
步骤一、找到该帖子的源代码
步骤二、爬取网页内容,使用xpath方法获取href的内容
# 构造URL
def tiebaSpider(self):
for page in range(self.beginPage,self.endPage+1):
pn = (page-1)*50
wo = {'pn': pn, 'kw': self.tiebaname}
word = urllib.parse.urlencode(wo)
myurl = self.url + word
self.loadPage(myurl)
# 爬取页面内容
def loadPage(self, url):
req = request.Request(url, headers=self.ua_head)
# req = request.Request(url)
data = request.urlopen(req).read()
htm = etree.HTML(data)
links = htm.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')
打印links,发现列表是空白的。
语法正确,为什么没有值呢?
发现,【class="threadlist_lz clearfix"】class内容包含空格,
(之前使用selenium做自动化测试,如果class内有空格,将空格变为.就可以定位到了)
将空格修改为【.】尝试了一下,仍然没有数据,尝试失败。。。。
后来经人提醒,可能是headers有问题。
那就试试直接发送请求,将自定义的请求头【headers=self.ua_head】代码删除,
即变更为【req = request.Request(url)】发送请求。
执行之后,links列表取到了正确的url值。ok问题解决。
但是,不带headers,短期内发送多次请求的话,IP容易被封。。。。
或许可以试试换个headers。
于是百度“常见的浏览器请求头”,尝试了各种不同浏览器的请求头,发现IE浏览器的可以使用。
例如:
self.ua_head = {'User-Agent': 'User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;'}
这样,问题就解决了。
总结一下,有两种方法:
方法一:发送请求时,不带请求头headers
方法二:带headers发送请求,headers内容使用IE浏览器的请求头信息,亲测可用
注:文章内容主要是记录学习过程中遇到的一些问题,以及解决方法。留个记录,同时分享给有需要的人。如有不足之处,欢迎指正,谢谢!
原文链接:https://blog.csdn.net/elsa_yxy1984/article/details/106904441