重工电子论坛
标题: Python爬取数据规则的网站 [打印本页]
作者: 鲁亮 时间: 2018-3-8 14:40
标题: Python爬取数据规则的网站
本帖最后由 鲁亮 于 2018-3-8 14:40 编辑
今天闲来无事,将实验室学弟发来的一个名为"源码天空”网站进行了爬虫练习,学习Python也有好几个周了,就想着试试手,于是,说干就干!
贴出网址:http://www.codesky.net/
首先使用的是pycharm这个IDE,感觉还比较好用,符合个人编程习惯,推荐!
爬取第一步,查看网页URL的规律,随便点击了一个版块—java源码,然后查看网页源代码;
得到网页的基本信息,网页编码格式“utf-8”,URL:http://m.codesky.net/java/,说白了就是在网址后再添加了java字段,
然后多点击几个下一页,得到新的网址URL
http://www.codesky.net/java/list-2.htm
http://www.codesky.net/java/list-3.htm
套路出现,直接来
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
for n in range(1, 5):
a_url = 'http://www.codesky.net/java/list'+str(n)+'.htm'
print(a_url)
第一步搞定,再来第二步,提取网页信息,再使用正则表达式查找数据
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
html_1 = requests.get(a_url)
print(html_1.status_code)
print(html_1.text)
网页抓取了,但是怎么去查找我们想要的信息呢?
我们可以直接去从结果出发,点击一个开源源码信息,然后拿到了网址之后,再回到之前的网页源码中查找我们要的URL。
</a>] <a href="/showhtml/30289.htm" target="_blank">这就是我们需要的信息!!!
立马使用正则表达式!什么?正则是什么东西??不知道这个的自行百度去吧,我就不在这里说了。
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
# 正则表达式查找源码网页URL
detil_list = re.findall('</a>] <a href="(.*?)" target="_blank">', html_1.text)
print(detil_list)
作者: 鲁亮 时间: 2018-3-8 14:40
找到了每一个项目的URL后,还不算完,如果只是用那个URL,我们是不能访问网页的,
'/showhtml/30289.htm', '/showhtml/30266.htm', '/showhtml/30233.htm', '/showhtml/30167.htm',
因此,我们还需要进行拼接。现在来看看目标URL
http://www.codesky.net/showhtml/30289.htm
对照找到的数据,不难看出是首页的URL加上找到的URL,
即 http://www.codesky.net/ + /showhtml/30289.htm'。
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
for m in detil_list:
b_url = 'http://www.codesky.net' + m
print(b_url)
进入了下载网页之后,我们需要找到下载链接的URL,还是原来的套路,先用目标URL,然后回去找,找到之后正则表达式!!
下载URL:http://www.codesky.net/download/d/?id=30289&loc=0
网页数据:<a href="/download/d/?id=30289&loc=0"><img src="/images/download2.gif" align='absmiddle' border=0></a>
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
html_2 = requests.get(b_url)
# print(html_2.text)
ftp_1 = re.findall('<a href="(.*?)"><img src="/images/download2.gif"', html_2.text)
print(ftp_1)
ftp_2 = ''http://www.codesky.net'+ftp_1[0]
print(ftp_2)
然后就把下载链接放到TXT文档里面保存着,想下载什么就下载什么。
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
with open('C:\\Users\\Administrator\\PycharmProjects\\源码天空\\code.txt', 'a', encoding='utf-8') as code:
code.write(ftp_1[0]+'\n')
但是事情并没有这么简单,如果直接用这个链接下载,结果会是这个样子!
什么鬼??从本站下载??我难道不是吗??
最后在经过无数的尝试后,由于自身学艺不精,没得破解这个难题,只能对而求其次,只能把下载页面的链接保存下来,但是这样又能有什么用呢,还不如直接用他的网页直接下载!
后来想想反正也是学习,都到这一步了,我可以试试把数据放到数据库中。
作者: 鲁亮 时间: 2018-3-8 15:03
本帖最后由 鲁亮 于 2018-3-8 15:18 编辑
下面就是数据库操作相关了,首先安装pymysql模块,使用pip安装,
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
pip install pymysql
数据库基本操作这里就不说了,直接用,不知道就需要自行百度了。
我使用的是oracle的mysql数据库,安装在腾讯云上的。
首先打开数据库连接
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
# 打开数据库连接
db = pymysql.connect(
host='localhost',
port=3306,
user='root', # 数据库用户名
passwd='********', # 数据库密码
db='test',
charset='utf8'
)
然后创建curcursor游标对象,并且新建数据表,使用完之后记得关闭连接,并关闭数据库,否则会出错。
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# print(db)
# 如果存在数据表,删除
cursor.execute("DROP TABLE IF EXISTS code")
# 创建数据表
sql = """CREATE TABLE IF NOT EXISTS code(
code_name text,
code_language VARCHAR(20),
code_url text)"""
# 执行数据库execute操作
cursor.execute(sql)
# 关闭数据库连接
cursor.close()
# 断开数据库
db.close()
最后插入数据,使用mysql语句“INSERT”
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
# 插入数据
cursor.execute('INSERT INTO code(code_name,code_language,url)VALUES("%s","%s","%s")' % (url_name, language, b_url))
# commit 修改
db.commit()
作者: 鲁亮 时间: 2018-3-8 15:20
本帖最后由 鲁亮 于 2018-3-8 15:23 编辑
以上就是所有的操作,最后我使用面向对象编程,创建了一个类,然后把数据库的创建放在了__init__(self)里面,下面贴出源代码。
-
-
源码天空.zip
1.9 KB, 阅读权限: 10, 下载次数: 2
作者: 李维强-15级 时间: 2018-3-8 20:08
尝试下,调用浏览器登录,然后对方网站的后台就有相应的session和你浏览器会有相应的cookies,这样算作登录状态,然后再去模拟点击下载。
作者: 鲁亮 时间: 2018-3-10 20:38
等把毕设做完了,可以去尝试一下
欢迎光临 重工电子论坛 (http://cqutlab.cn/) |
Powered by Discuz! X3.1 |