寻找到位置信息后,我们开始开心的爬取,先写提取标题的代码测试一下:
headers ={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36',}
url ='https://bbs.hupu.com/lol-1'# 与首页地址https://bbs.hupu.com/lol等同
res = requests.get(url, headers=headers)
root = etree.HTML(res.text)
name = root.xpath('//ul[@class="for-list"]/li//a[@class="truetit"]/text()')for i in name:print(i)
结果为
好像完美的成功了(顺序同网页显示的不同),但当我们再提取完作者等信息后,就会发现,标题竟然与作者信息等不匹配,标题数量少于其他信息的数量。这应该是有某些标题我们并没有爬取到,再次分析源码发现,虎扑对有些标题进行了特殊标记,它们存在与标签中,如图:
所以我们的xpath不能通过直接匹配text()来提取信息了,迂回一下:
name = root.xpath('//ul[@class="for-list"]/li//a[@class="truetit"]')for i inrange(len(name)):if name[i].text:print(name[i].text)elseprint(name[i][0].text)
由于xpath返回的是一个列表,如果标题不在标签中name[i].text有内容即标题,否则标题存在于name[i][0].text中,这样爬取的才是全部的标题。而其他信息正常爬取即可。
3. 完整代码
defhupu_spilder(url):
info =[]# 存放所有信息的列表# 对爬虫进行简单的伪装
headers ={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36',}
res = requests.get(url, headers=headers)
root = etree.HTML(res.text)# 通过xpath提取所有需要的信息
name = root.xpath('//ul[@class="for-list"]/li//a[@class="truetit"]')
href = root.xpath('//ul[@class="for-list"]/li//a[@class="truetit"]/@href')
author = root.xpath('//ul[@class="for-list"]/li//a[@class="aulink"]/text()')
time = root.xpath('//ul[@class="for-list"]/li//a[@style="color:#808080;cursor: initial; "]/text()')# 判断标题存在于哪里,并将信息列表加入到info中for i inrange(len(name)):if name[i].text:
info.append([name[i].text, author[i], time[i],'https://bbs.hupu.com'+ href[i]])else:
info.append([name[i][0].text, author[i], time[i],'https://bbs.hupu.com'+ href[i]])return info
if __name__ =='__main__':
fieldnames =['name','author','time','href']# 信息名称
f =open('hupu.csv','a+', encoding='utf-8')# 通过追加模式打开文件
f_csv = csv.writer(f)
f_csv.writerow(fieldnames)# 将各个信息的名称写入for i inrange(1,11):# 爬取前十页
url ='https://bbs.hupu.com/lol-{}'.format(i)# 拼接url
info = hupu_spilder(url)
f_csv.writerows(info)# 将一页的所有信息写入
f.close()print("爬取完成!")
由此就将爬取的信息写入到csv文件中了
本博客文章仅供博主学习交流,博主才疏学浅,语言表达能力有限,对知识的理解、编写代码能力都有很多不足,希望各路大神多多包涵,多加指点。