重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 5201|回复: 5
打印 上一主题 下一主题

Python爬取数据规则的网站

[复制链接]

14

主题

69

帖子

485

积分

学生管理组

Rank: 8Rank: 8

积分
485
QQ
跳转到指定楼层
楼主
发表于 2018-3-8 14:40:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 鲁亮 于 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>]&nbsp;<a href="/showhtml/30289.htm"  target="_blank">这就是我们需要的信息!!!
立马使用正则表达式!什么?正则是什么东西??不知道这个的自行百度去吧,我就不在这里说了。
[Python] syntaxhighlighter_viewsource syntaxhighlighter_copycode
# 正则表达式查找源码网页URL
detil_list = re.findall('</a>]&nbsp;<a href="(.*?)"  target="_blank">', html_1.text)
print(detil_list)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

14

主题

69

帖子

485

积分

学生管理组

Rank: 8Rank: 8

积分
485
QQ
沙发
 楼主| 发表于 2018-3-8 14:40:34 | 只看该作者
找到了每一个项目的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>&nbsp;


[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')

但是事情并没有这么简单,如果直接用这个链接下载,结果会是这个样子!

什么鬼??从本站下载??我难道不是吗??
最后在经过无数的尝试后,由于自身学艺不精,没得破解这个难题,只能对而求其次,只能把下载页面的链接保存下来,但是这样又能有什么用呢,还不如直接用他的网页直接下载!
后来想想反正也是学习,都到这一步了,我可以试试把数据放到数据库中。
回复 支持 反对

使用道具 举报

14

主题

69

帖子

485

积分

学生管理组

Rank: 8Rank: 8

积分
485
QQ
板凳
 楼主| 发表于 2018-3-8 15:03:15 | 只看该作者
本帖最后由 鲁亮 于 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()

回复 支持 反对

使用道具 举报

14

主题

69

帖子

485

积分

学生管理组

Rank: 8Rank: 8

积分
485
QQ
地板
 楼主| 发表于 2018-3-8 15:20:00 | 只看该作者
本帖最后由 鲁亮 于 2018-3-8 15:23 编辑

以上就是所有的操作,最后我使用面向对象编程,创建了一个类,然后把数据库的创建放在了__init__(self)里面,下面贴出源代码。

源码天空.zip

1.9 KB, 阅读权限: 10, 下载次数: 2

回复 支持 反对

使用道具 举报

287

主题

668

帖子

5635

积分

学生管理组

Rank: 8Rank: 8

积分
5635
5#
发表于 2018-3-8 20:08:15 | 只看该作者
尝试下,调用浏览器登录,然后对方网站的后台就有相应的session和你浏览器会有相应的cookies,这样算作登录状态,然后再去模拟点击下载。
回复 支持 反对

使用道具 举报

14

主题

69

帖子

485

积分

学生管理组

Rank: 8Rank: 8

积分
485
QQ
6#
 楼主| 发表于 2018-3-10 20:38:06 | 只看该作者
李维强-15级 发表于 2018-3-8 20:08
尝试下,调用浏览器登录,然后对方网站的后台就有相应的session和你浏览器会有相应的cookies,这样算作登录 ...

等把毕设做完了,可以去尝试一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-4-27 01:33 , Processed in 0.177973 second(s), 31 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表