爬虫实现
1.爬虫初步实现
(1)我们爬取中国化工市场机械网,以下为相关代码演示
import requests
from bs4 import BeautifulSoup
res = requests.get(addresses[i])
res.encoding = 'GB18030' # 通过修改编码方式为GB18030,兼容网站编码(gb2312)
# 这里的'html.parser'是为了告诉BeautifulSoup这个html_sample的解析形式是html格式#
soup = BeautifulSoup(res.text, 'html.parser')
article_content = soup.select(
'#NewsMainLeft > div.mainBox.MarginTop10.articleBox > div.article > div.ArticleMatter')
article_title = soup.select(
'#NewsMainLeft > div.mainBox.MarginTop10.articleBox > div.article > div.articleTitle > h1')
此处select()中的内容,可以使用chrome浏览器的开发者模式,选中该标签,右键copy->copy selector,再复制到select()中,更精确。
利用print()方法可以将爬下来的字段打印出来。
但是只可以爬取单一网址下的内容,如果想批量爬取改网站文章,就需要多次更改爬取的网址,不合理。
(2)我发现有两个办法可以实现批量的爬取
- 发现网址之间的规律,使用循环每次更改网址,但是使用中发现网址的变化有时会脱离规律,在运行过程中会出现一些错误,因此不推荐使用该方法。
- 另一种方法是:再爬取网站内的下一篇的<a>标签内的href属性,作为返回值,使用到下一次循环当中。如下代码演示:
next_address = soup.select(
'#NewsMainLeft > div.mainBox.MarginTop10.articleBox > div.article > div.arNext > a[href]')
2. 爬取文本初步整理
爬取下来的文本,我发现有一些位置出现不必要的字符、回车等,这些如果无法处理,将影响到后期存储数据,故需要清除,代码如下:
for s in article_title:
delete = str(s.contents)
title = delete.replace('[\'', '').replace('\']', '').replace('\\r', '').replace('\\n', '').replace('\\t', '')\
.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('\"', '')\
.replace('<', '').replace('>', '').replace('|', '')
for t in article_content:
delete = str(t.contents)
context = delete.replace('[\'', '').replace('\']', '').replace('\\r', '').replace('\\n', '').replace('\\t', '')\
.replace('\\u3000', '').replace('\', <br/>,', '').replace('<br/>, \'', '').replace('<br/>,', '')\
.replace('<br/>', '').replace('</p>', '').replace('<p>', '').replace(' ', '').replace('\'', '').lstrip('\'')
title_and_context = title+'。'+context
if title_and_context[len(title_and_context)-1] == "\'":
title_and_context = title_and_context[:len(title_and_context)-1] + ''
经过上述处理,文本信息初步处理完毕
文章存储
(1)涉及编码问题,首先,被爬取的网页的编码为gb2312,但是在爬取过程中,如:“槃”字仍无法识别报错,我将爬虫的爬取编码设为gb18030,问题解决。gb18030是gb2312和gbk编码扩大后的编码格式,支持的汉字更多。
(2)数据库也需要设置,通常,mysql默认建立数据库和表的编码是utf-8,在这里,我改成gb18030防止存入数据库时出错.
如上图的设置
(3)保存为.txt
# 保存到文本文件当中
def save_files(path, curr_file_name, curr_content):
if os.path.exists(path): # 判断文件夹是否存在
os.chdir(path) # 进入文件夹
elif os.getcwd()[-len(path):] == path:
print("本篇文章已存入")
else:
os.mkdir(path) # 创建文件夹
os.chdir(path) # 进入文件夹
f = open(curr_file_name, 'w', encoding='GB18030')
f.write(curr_content)
f.close()
print(os.getcwd())
(4)保存到数据库
- 建立数据库连接
util.py
import mysql.connector
def get_connect(curr_host, curr_user, curr_passwd, curr_database):
my_db = mysql.connector.connect(
host=curr_host, # 数据库主机地址
user=curr_user, # 数据库用户名
passwd=curr_passwd, # 数据库密码
database=curr_database # 进入数据库
)
my_cursor = my_db.cursor()
return my_cursor, my_db
- 创建数据库
import mysql.connector
# my_cursor.execute("CREATE DATABASE articles_db")
# my_cursor.execute("USE articles_db")
my_db = mysql.connector.connect(
host="localhost", # 数据库主机地址
user="root", # 数据库用户名
passwd="123", # 数据库密码
database="articles_db" # 进入数据库
)
my_cursor = my_db.cursor()
my_cursor.execute(
"CREATE TABLE articles_tb (id INT AUTO_INCREMENT PRIMARY KEY, htmlId varchar(255), context MEDIUMTEXT)")
- 保存到数据库中
# 保存到mysql中
def save_files_to_mysql(curr_file_name, curr_content):
my_cursor, my_db = util.get_connect("localhost", "root", "123", "articles_db")
sql_1 = "INSERT INTO articles_tb (htmlId,context)VALUES(\'"
sql_2 = "\',\'"
sql_3 = "\')"
sql = sql_1+curr_file_name+sql_2+curr_content+sql_3
print("sql:" + sql)
my_cursor.execute(sql)
my_db.commit() # 提交到数据库执行,必须一步勿忘
my_cursor.close()
my_db.close
最后,如果你对Python感兴趣,想要学习python,希望可以帮到你,一起加油!以上是给大家分享的Python全套学习资料,都是我自己学习时整理的:
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频全套
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
**学习资源已打包,需要的小伙伴可以戳这里:【学习资料】
标签:curr,Python,数据库,db,爬虫,replace,cursor,my,想学 From: https://blog.csdn.net/Python_Alex/article/details/139883108