爬虫(Xpath)——爬tieba.baidu.com
工具:python3
核心知识点:
1)lxml包不能用pip下载,因为里面有其他语言编写的文件
2)urlopen返回的请求是html文件,要使用 content = etree.HTML(html)来将其转换为xml
3)使用content.xpath()返回一个匹配成功的列表集合
4)构造新的url,进入这个url,进行数据爬取
问题:在执行loadPage时遇到了问题,
link_list = content.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
这个正则表达式在xpath helper中能够找到对应的href值,如图:
但是在在执行程序时 link_list = content.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href') 返回的列表值为空,如图:
尝试进入两个输出的fullurl均能正确进入网页,说明上一步传入的网址是没有错误的呀!
到底是什么原因呢?
import urllib.request
import re
from lxml import etree class Spider:
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36",
} def loadPage(self, link):
"""
下载页面
"""
print("正在下载数据。。。。。。") request = urllib.request.Request(link, headers=self.headers)
html = urllib.request.urlopen(request).read()
# html = html.decode("utf-8") with open("meinvba.txt", "w") as f:
f.write(str(html)) # 获取每页的HTML源码字符串
# html = html.decode("gbk") # 解析html文档为HTML DOM类型
content = etree.HTML(html)
print(content)
# 返回所有匹配成功的列表集合
link_list = content.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
print(link_list)
for i in link_list:
print("__4__")
fulllink = "http://tieba.baidu.com" + i
self.loadImage(fulllink)
print("___3___") # 取出每个帖子的图片链接
def loadImage(self, link):
request = urllib.request.Request(link, headers=self.headers)
html = urllib.request.urlopen(request).read()
content = etree.HTML(html)
link_list = content.xpath('//img[@class="BDE_Image"]/@src')
print("____1____")
for link in link_list:
self.writeImage(link) def writeImage(self, link):
request = urllib.request.Request(link, headers=self.headers)
image = urllib.request.urlopen(request).read()
filename = link[-5:]
print("___2____")
with open(filename, "wb") as f:
f.write(image)
print("*"*30) def startWork(self, kw, beginpage, endpage):
"""
控制爬虫运行 """
url = "http://tieba.baidu.com/f?"
key = urllib.parse.urlencode({"kw": kw})
print("key:" + key)
fullurl = url + key
for page in range(int(beginpage), int(endpage) + 1):
pn = (page - 1)*50
fullurl = fullurl + "&pn=" + str(pn) self.loadPage(fullurl)
# print("fullurl:" + fullurl) if __name__ == "__main__":
tiebaSpider = Spider()
kw = input("请输入要爬取的贴吧名:")
beginpage = input("请输入起始页:")
endpage = input("请输入结束页:") tiebaSpider.startWork(kw, beginpage, endpage)
好想知道哪里出了错误啊!!!
*******************************************************************更新*************************************************************************************
我找到了原因!各种尝试之后我发现将loadPage方法中的
request = urllib.request.Request(link,headers=self.headers)改为
request = urllib.request.Request(link)就好了!
很奇怪啊,后来我尝试修改user-agent的值,也是同样的结果:只有loadPage方法的request请求没有headers时才能正常使用。
爬虫(Xpath)——爬tieba.baidu.com的更多相关文章
- python爬虫案例:使用XPath爬网页图片
用XPath来做一个简单的爬虫,尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地. # -*- coding:utf-8 -*- import urllib import ...
- Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)
这道题是一道爬虫练习题,需要爬链接http://tieba.baidu.com/p/2166231880里的所有妹子图片,点进链接看一下,这位妹子是日本著名性感女演员--杉本由美,^_^好漂亮啊,赶紧 ...
- 爬虫系列4:Requests+Xpath 爬取动态数据
爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...
- 爬虫系列2:Requests+Xpath 爬取租房网站信息
Requests+Xpath 爬取租房网站信息 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 ...
- 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP
爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...
- 爬虫系列(十) 用requests和xpath爬取豆瓣电影
这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...
- 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论
这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...
- python网络爬虫之解析网页的XPath(爬取Path职位信息)[三]
目录 前言 XPath的使用方法 XPath爬取数据 后言 @(目录) 前言 本章同样是解析网页,不过使用的解析技术为XPath. 相对于之前的BeautifulSoup,我感觉还行,也是一个比较常用 ...
- Python实战项目网络爬虫 之 爬取小说吧小说正文
本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...
随机推荐
- RabbitMQ消息队列随笔
本文权当各位看官对RabbitMQ的基本概念以及使用场景有了一定的了解,如果你还对它所知甚少或者只是停留在仅仅是听说过,建议你先看看这篇文章,在对RabbitMQ有了基本认识后,我们正式开启我们的Ra ...
- BZOJ_4987_Tree_树形DP
BZOJ_4987_Tree_树形DP Description 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一 ...
- poj1149PIGS——网络最大流
题目:http://poj.org/problem?id=1149 不把猪圈当做点,而把顾客当作点,把猪当作边权(流量): 因为猪圈中的猪可流动,所以共用一个猪圈的人互相连边: 注意应该连成链的形式, ...
- 四 Vue学习 router学习
index.js: 按需加载组件: const login = r => require.ensure([], () => r(require('@/page/login')), 'log ...
- jsonp实现数据跨域请求
1.我们知道,哪怕跨域js文件中的代码(当然指符合web脚本安全策略的),web页面也是可以无条件执行的. 远程服务器remoteserver.com根目录下有个remote.js文件代码如下: al ...
- complexType
//decltype的表达式如果是加上括号的变量,结果将是引用 decltype((variable)) ruiy; //此变量的数据类型是引用(但此处变量的申明语句是错误的,引用不是对象,指向的对象 ...
- SQL 调用 webservice
webservice 需要配置为get 方式 sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole ...
- #if _MSC_VER > 1000 #pragma once #endif
#if _MSC_VER > 1000 #pragma once #endif 解释: 这是微软的预编译控制. 在_MSC_VER较小时,它对一些东西的支持与新版不同 _MSC_VER分解如下: ...
- 《精通Spring4.X企业应用开发实战》读后感第三章
- SQL中的row_number() over()解释
有一个面试题目, 有一张表,如下: event_type value time : - : : : : : 需要按照event_type排序,返回同一个event_type的,最近时间和次近时间的两个 ...