鲁亮 发表于 2018-3-8 14:40:33

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
套路出现,直接来
for n in range(1, 5):
    a_url = 'http://www.codesky.net/java/list'+str(n)+'.htm'
    print(a_url)

第一步搞定,再来第二步,提取网页信息,再使用正则表达式查找数据
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">这就是我们需要的信息!!!
立马使用正则表达式!什么?正则是什么东西??不知道这个的自行百度去吧,我就不在这里说了。
# 正则表达式查找源码网页URL
detil_list = re.findall('</a>]&nbsp;<a href="(.*?)"target="_blank">', html_1.text)
print(detil_list)

鲁亮 发表于 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'。
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;

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
print(ftp_2)

然后就把下载链接放到TXT文档里面保存着,想下载什么就下载什么。
with open('C:\\Users\\Administrator\\PycharmProjects\\源码天空\\code.txt', 'a', encoding='utf-8') as code:
    code.write(ftp_1+'\n')
但是事情并没有这么简单,如果直接用这个链接下载,结果会是这个样子!

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

鲁亮 发表于 2018-3-8 15:03:15

本帖最后由 鲁亮 于 2018-3-8 15:18 编辑

下面就是数据库操作相关了,首先安装pymysql模块,使用pip安装,
pip install pymysql
数据库基本操作这里就不说了,直接用,不知道就需要自行百度了。
我使用的是oracle的mysql数据库,安装在腾讯云上的。
首先打开数据库连接
# 打开数据库连接
db = pymysql.connect(
            host='localhost',
            port=3306,
            user='root',# 数据库用户名
            passwd='********',# 数据库密码
            db='test',
            charset='utf8'
)
然后创建curcursor游标对象,并且新建数据表,使用完之后记得关闭连接,并关闭数据库,否则会出错。
# 使用 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_languageVARCHAR(20),
             code_url text)"""

# 执行数据库execute操作
cursor.execute(sql)

# 关闭数据库连接
cursor.close()
# 断开数据库
db.close()
最后插入数据,使用mysql语句“INSERT”
# 插入数据
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:00

本帖最后由 鲁亮 于 2018-3-8 15:23 编辑

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

李维强-15级 发表于 2018-3-8 20:08:15

尝试下,调用浏览器登录,然后对方网站的后台就有相应的session和你浏览器会有相应的cookies,这样算作登录状态,然后再去模拟点击下载。

鲁亮 发表于 2018-3-10 20:38:06

李维强-15级 发表于 2018-3-8 20:08
尝试下,调用浏览器登录,然后对方网站的后台就有相应的session和你浏览器会有相应的cookies,这样算作登录 ...

等把毕设做完了,可以去尝试一下
页: [1]
查看完整版本: Python爬取数据规则的网站