爬虫入门
爬取百度实时热点排行榜(lxml 模块中的 XPath 解析器)
案例1
- 爬虫技术要求: 使用网络请求模块 requests与 lxml 模块中的 XPath 解析器,爬取百度实时热点排行榜(网址:https://top.baidu.com/board?tab=realtime)
- 爬虫设计方案: (1)使用 requests.get(url) 函数向服务器提交请求;
(2)然后将响应的网页信息交给 lxml 库解析,获取自己想要的内容;
(3)最后使用 open() 函数将爬取的数据写入 TXT 文件。
知识点
Lxml表达式 | 描述 |
---|---|
Nodename | 选取此节点的所有子节点 |
// | 从当前节点选取子孙节点 |
/ | 从当前节点选取子节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
* | 选取所有节点 |
存储
如果想要简单地进行 TXT 文件存储工作,可以通过open() 函数操作文件实现,即需要先创建或者打开指定的文件并创建文件对象。open() 函数的基本语法格式如下: file = open(filename[,mode[,buffering]])
值 | 说明 | 注意 |
---|---|---|
r | 以只读模式打开文件。文件的指针将会放在文件的开头 | 文件必须存在 |
rb | 以二进制格式打开文件,并且采用只读模式。文件的指针将会放在文件的开头,一般用于非文本文件,如图片、声音等 | 文件必须存在 |
r+ | 打开文件后,可以读取文件内容,也可以写入新的内容覆盖原有内容(从文件开头进行覆盖) | 文件必须存在 |
rb+ | 以二进制格式打开文件,并且采用读写模式。文件的指针将会放在文件的开头,一般用于非文本文件,如图片、声音等 | 文件必须存在 |
w | 以只写模式打开文件 | 文件存在,则将其覆盖,否则创建新文件 |
wb | 以二进制格式打开文件,并且采用只写模式。一般用于非文本文件,如图片、声音等 | 文件存在,则将其覆盖,否则创建新文件 |
w+ | 打开文件后,先清空原有内容,使其变为一个空的文件,对这个空文件有读写权限 | 文件存在,则将其覆盖,否则创建新文件 |
wb+ | 以二进制格式打开文件,并且采用读写模式。一般用于非文本文件,如图片、声音等 | 文件存在,则将其覆盖,否则创建新文件 |
a | 以追加模式打开一个文件。如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于写入 | |
ab+ | 以二进制格式打开文件,并且采用追加模式。如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于写入 | |
a+ | 以读写模式打开文件。如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于读写 | |
ab+ | 以二进制格式打开文件,并且采用追加模式。如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于读写 |
mode:可选参数,用于指定文件的打开模式。其参数值如下表所示。默认的打开模式为只读(即 r)。
etree主要函数
主要函数 | 作用 |
---|---|
etree.HTML() | 解析字符串格式的HTML文档对象,将字符串参数变为Element对象,以便使用xpath()等方法; |
etree.tostring() | 将Element对象转换成字符串; |
etree.fromstring() | 将字符串转换成Element对象。 |
实现代码
import requests
from lxml import etree
records = []
# 处理字符串中的空白符,并拼接字符串
def processing(strs):
s = '' # 定义保存内容的字符串
for n in strs:
n = ''.join(n.split())# 去除空白符
s = s + n # 拼接字符串
return s # 返回拼接后的字符串
# 定义解析页面函数,用来获取百度实时热点排行榜信息
def get_hotspot_info(url, headers):
response = requests.get(url=url,headers=headers) # 发送网络请求
html = etree.HTML(response.text) # 解析HTML字符串
div_all = html.xpath('//div[@class="category-wrap_iQLoo horizontal_1eKyQ"]') # 获取实时热点相关所有信息
# print(div_all)
for div in div_all:
rank = div.xpath('a/div[1]/text()')[0] # 获取实时热点排名
rank = processing(rank) # 处理实时热点排名
# //*[@id="sanRoot"]/main/div[2]/div/div[2]/div[1]/div[2]/a/div[1]
# //*[@id="sanRoot"]/main/div[2]/div/div[2]/div[2]/div[2]/a/div[1]
# //*[@id="sanRoot"]/main/div[2]/div/div[2]/div[3]/div[2]/a/div[1]
title = div.xpath('div[2]/a/div[1]/text()')[0] # 获取实时热点标题
title = processing(title) # 处理实时热点标题
# //*[@id="sanRoot"]/main/div[2]/div/div[2]/div[2]/div[1]/div[2]
index = div.xpath('div[1]/div[2]/text()')[0] # 获取实时热点热搜指数
index = processing(index) # 处理实时热点热搜指数
record = rank + '\t' + title + '\t' + index # 拼接百度实时热点排行榜信息
# print(record) # 输出
records.append(record)
return records
def save_as_txt(records):
for item in records:
with open('D:/李诗浩/实例/实例/爬虫/request_anli/baiduredain.txt','a',encoding='utf-8') as data:
data.write(item + '\n')
# 程序入口
if __name__ == '__main__':
url = 'https://top.baidu.com/board?tab=realtime' # 百度实时热点排行榜链接
headers={
'Cookie':'BAIDUID=BFA84A2CB58B9C52A8354081CEF8173D:FG=1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
}
records=get_hotspot_info(url, headers)
save_as_txt(records)
爬取网易新闻热点排行Top10(正则表达式re 模块)
案例2
- 爬虫爬取的内容:网易新闻热点排行榜的排名、标题、跟帖数和链接。
- 爬虫技术要求:使用网络请求模块 requests 与 bs4 模块中的 BeautifulSoup 模块 解析网页数据,获取网易新闻热点排行榜的排名、标题、跟帖数和链接(爬取页面的url:https://news.163.com/)。最后使用 pandas 模块 保存数据,并生成 CSV 文件。
知识点
BeautifulSoup对象 | 功能 |
---|---|
Tag | 使用BeautifulSoup构造方法获取到文档对象之后,Tag对象可以看作HTML中的标签对象,可以使用.操作符获取,获取到Tag对象后可以获取对应HTML标签的属性,使用类似字典的操作方法获取。 |
NavigableString | 字符串常被包含在标签(Tag)内,NavigableString类用来包装Tag中的字符串。获取到Tag对象后,使用.string即可获取到标签内的字符串。 |
BeautifulSoup | BeautifulSoup对象表示的是一个文档的全部内容,大部分时候可以把它看作Tag对象,支持遍历文档树中的大部分方法,它的name属性有一个特殊值document。 |
Comment | Comment对象是一个特殊的NavigableString对象,表示注释内容。 |
-
遍历搜索文档(find()方法与find_all())
find()方法与find_all()使用方法相似,唯一区别是find_all()方法返回的结果是一个列表,而find()方法只返回搜索到的第一个结果。find_all()方法找不到目标时返回空列表,find()方法找不到目标时返回None。
例如:
查找id为link2的标签,查找所有类名为sister的a标签
soup.find_all(id=“link2”),soup.find_all(“a”,class_=“sister”) -
获取标签内容
标签 | 作用 |
---|---|
get | 用来获取HTML或XML文档中所有的文本内容,即去除HTML或XML标签后的纯文本,获取标签的属性值例如href,name等 |
.text | 获取标签内的文本 |
实现代码
import requests
import pandas as pd
from bs4 import BeautifulSoup
def get_news_info(url, headers):
response = requests.get(url=url,headers=headers) # 发送网络请求
soup = BeautifulSoup(response.text, features="lxml") # 创建一个BeautifulSoup对象,获取页面正文
all_news = soup.find('div','mt35 mod_hot_rank clearfix').find('ul').find_all('li') # 获取网易新闻热点排行Top10内容
# print(all_news)
news_list = [] # 创建空列表
for news in all_news:
news_rank = news.find('em').text # 获取新闻排名
news_title = news.find('a').get('title') # 获取新闻标题
posts_num = news.find('span').text # 获取新闻跟帖数
news_url = news.find('a').get('href') # 获取新闻链接
news_list.append([news_rank,news_title,posts_num,news_url]) # 把每条新闻的排名、标题、跟帖数和链接添加到一个列表中,再追加到一个大列表中
return news_list # 返回列表
def save_as_csv(news_list):
data=pd.DataFrame(data=news_list,index=None,columns=None)
data.to_csv('网易新闻热点排行Top10.csv')
# 程序入口
if __name__ == '__main__':
url = 'https://news.163.com/' # 网易新闻首页链接
# 定义请求头信息
headers = {
'Cookie':'_ntes_nuid=a15db63e5c12047a2748a03bc77ca4d8; ne_analysis_trace_id=1685775934666; _antanalysis_s_id=1685775935244; vinfo_n_f_l_n3=019bfc077250a148.1.1.1685775934673.1685776866850.1685788791418; s_n_f_l_n3=019bfc077250a1481685788791418',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/71.0.3578.80 Chrome/71.0.3578.80 Safari/537.36'
}
news_list = get_news_info(url=url,headers=headers) # 调用爬虫方法,获取网易新闻热点排行Top10
# print(news_list) # 输出网易新闻热点排行Top10信息
save_as_csv(news_list)
爬取百度贴吧指定吧帖子内容(findall 函数解析)
案例3
- 爬取内容 :
爬取百度贴吧“police”吧前5页所有帖子的标题、作者、链接和创建时间。 - 要求:
使用网络请求模块 requests 与正则表达式re 模块提取百度贴吧“police”吧 HTML 代码信息(网址:https://tieba.baidu.com/f?kw=police&ie=utf-8&pn=0)。 - 爬虫设计方案:
(1)使用requests.get(url) 函数向服务器提交请求;
(2)然后将响应的网页信息交给re模块解析,从 HTML 代码中提取出帖子的标题、作者、链接和创建时间;
(3)最后使用open() 函数将爬取的数据写入 txt 文件。
知识点
- 正则表达式模块 re 简介
正则表达式是一个特殊的字符序列,它能帮助用户便捷地检查一个字符串是否与某种模式匹配。在爬虫中,我们经常会使用它从抓取到的网页源码或接口返回内容中,匹配提取我们想要的数据。
正则表达式由元字符及其不同组合来构成,通过巧妙地构造正则表达式可以匹配任意字符串,并完成复杂的字符串处理任务。
元字符 | 功能说明 |
---|---|
. | 匹配除换行符"\n"以外的任意单个字符 |
* | 匹配前面的字符0次或多次 |
+ | 匹配前面的字符1次或多次 |
? | 匹配前面的字符0次或1次 |
^ | 匹配字符串开头,在多行模式中匹配每一行的开头 |
$ | 匹配字符串末尾,在多行模式中匹配每一行的末尾 |
\ | 转义字符,使后一个字符改变原来的意思 |
{} | 按{}中的次数进行匹配。{m}表示匹配前一个字符m次;{m,n}表示匹配前一个字符m至n次,若省略n,则匹配m至无限次 |
[] | 匹配位于[]中的任意一个字符。字符集,对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义 |
() | 将位于()内的内容作为一个整体来对待 |
- 特殊表达式
特殊表达式序列 | 功能说明 |
---|---|
\f | 换页符匹配 |
\n | 换行符匹配 |
\r | 匹配一个回车符 |
\d | 匹配任何数字,相当于[0-9] |
\D | 与\d含义相反,等效于[^0-9] |
\s | 匹配任何空白字符,包括空格、制表符、换页符,与[\f\n\r\t\v]等效 |
\S | 与\s含义相反,匹配任何非空白字符,相当于[^\f\n\r\t\v] |
\w | 匹配任何字母、数字以及下划线,相当于[a-zA-Z0-9_] |
\W | 与\w含义相反,与[^a-zA-Z0-9_]等效 |
\b | 匹配单词头或单词尾,单词的分界符通常是空格、标点符号或者换行 |
\B | 与\b含义相反 |
\A | 仅匹配字符串开头,同^ |
\Z | 仅匹配字符串结尾,同$ |
- findall 函数解析
re 模块中的 findall() 函数用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。语法格式如下:
re.findall(pattern, string, [flags])
参数说明:
pattern:正则中的模式字符串,由要匹配的正则表达式转换而来。
string:表示要匹配的字符串。
flags:可选参数,表示标志位,用于控制匹配方式,比如:是否区分字母大小写。
- 常用标志
标志 | 说明 |
---|---|
A | 对于\w、\W、\b、\B、\d、\D、\s和\S只进行ASCII匹配 |
I | 执行不区分字母大小写的匹配 |
M | 将^和$用于包括整个字符串的开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处) |
S | 使用(.)字符匹配所有字符,包括换行符 |
X | 忽略模式字符串中未转义的空格和注释 |
- 返回值
(1) 如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。
在 get_posts_info() 函数 中使用 zip() 函数将帖子数据打包成元组组成的列表并返回给调用端。
(2)创建写入文件函数 save_as_txt(),将爬取的百度贴吧“police吧”帖子内容写入本地 TXT 文件。在该函数中首先通过 open() 函数创建 open 对象,以追加模式打开文件,编码为“utf-8”。然后循环遍历列表,得到包含帖子内容的元组。之后,使用下标索引访问元组的值,将’https://tieba.baidu.com/p/’ 与得到的值进行拼接,组成完成的 URL 链接。最后通过write() 函数 将爬取的每条帖子信息写入文件并在结尾换行,要求字段分隔符为“\t”。
(3)在主函数中调用 save_as_txt() 函数将爬取的百度贴吧“police吧”帖子内容写入 本地存储路径 文件。
实现代码
import requests
import re
result=[]
# 请求页面的函数
def get_page(url):
# 定义请求头信息
headers = {
'Cookie':'BAIDUID=20E0391EF8573978D496A1E0EAB047ED:FG=1; BAIDUID_BFESS=20E0391EF8573978D496A1E0EAB047ED:FG=1; Hm_lvt_98b9d8c2fd6608d564bf2ac2ae642948=1685866436; BAIDU_WISE_UID=wapp_1685866436363_311; USER_JUMP=-1; ZFY=RV:B2eSwVmkgGJcb2NNH1:BN1raWidrw6rxMAhU2x4Nto:C; arialoadData=false; video_bubble0=1; tb_as_data=8c7a399bddbfdc81784b67f57cfced9153a4b64ba213cb6e80baf65da7eda3ad34295fb7987d9a83f2f282287d9bbc052e31eeb97d693ce715b4023d9a0430b65a50ae35d918bcc116cf4bb86109015bf0671dc8c693c93f4f122481710b422f9570a7bc086ad87270ce67b85af41596; Hm_lpvt_98b9d8c2fd6608d564bf2ac2ae642948=1685876626; XFI=79dfed90-02c7-11ee-8312-b19133ac2735; BA_HECTOR=8g0k2g80ag018l210kag0l9n1i7orsi1m; XFCS=BCFA8610CE0610F2F12F246B055E16C3996D79054370E8F2D2998E3A157C976C; XFT=EWOaQ3SZBJVWDN17Za2IFrooXhLrbqCBrMl8RBliEkc=; RT="z=1&dm=baidu.com&si=281bcc38-1e6f-455f-90cc-142415cf7577&ss=lihbbgkx&sl=7&tt=c4q&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=4d8o&ul=4f4t"',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
response = requests.get(url=url,headers=headers) # 发送网络请求
return response.text # 以文本形式返回整个HTML页面
# 定义解析贴吧网页的爬虫函数,用来获取"police吧"帖子标题、作者、链接和创建时间
def get_posts_info(html):
posts_title = re.findall(r'title="(.*)" target="_blank" class="j_th_tit ',html) # 帖子标题
posts_author = re.findall(r'title="主题作者:(.*)"',html) # 帖子作者
posts_href = re.findall(r'href="(/p/\d{10})"', html) # 帖子链接
post_createtime = re.findall(r'title="创建时间">(\d{4}-\d{2})<',html) # 帖子创建时间
# print('帖子标题:', posts_title)
# print('帖子作者:', posts_author)
# print('帖子链接:', posts_href)
# print('帖子创建时间:', post_createtime)
msg=list(zip(posts_title,posts_author,posts_href,post_createtime))
return msg
# 程序入口
def save_as_txt(result):
for items in result:
for item in items:
with open('D:/李诗浩/实例/实例/爬虫/request_anli/baidutieba.txt', 'a', encoding='utf-8') as data:
for i in range(4):
data.write(item[0] + '\t')
data.write(item[1] + '\t')
data.write('https://tieba.baidu.com' + item[2] + '\t')
data.write(item[3] + '\t')
data.write('\n')
if __name__ == '__main__':
base_url = 'https://tieba.baidu.com/f?kw=police&ie=utf-8&pn={}' # "police吧"基础URL地址
for i in range(0, 201, 50): # 每页间隔50,实现循环,共5页
page_url = base_url.format(i) # 通过format替换切换页码的URL地址
# print(page_url)
html = get_page(page_url)# 调用请求页面的函数,获取整个HTML页面
# print(html)
posts_data = get_posts_info(html) # 调用解析贴吧网页的爬虫函数,获取"police"贴吧帖子标题、作者、链接和创建时间
result.append(posts_data)
for msg in result:
print(msg)
save_as_txt(result)
论坛话题前200条(parsel)
案例4
- 爬虫技术要求
使用网络请求模块 requests与 parsel模块,爬取论坛话题前200条 - 爬虫设计方案:
将数据完整爬下来命令为data,列名依次为username、reply、view、like将数据导入自己的mysql数据库中
(网址:https://forum.90sec.com/)
知识点
CSS选择器
无论是使用css选择器,还是xpath,re,都需要先创建一个parsel.Selector对象
将css()函数查询到的结果转换为字符串或者列表
get() | 将css() 查询到的第一个结果转换为str类型 |
getall() | 将css() 查询到的结果转换为python的列表 |
css选择器
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>标签选择器</title>
</head>
<body>
<p>css标签选择器的介绍</p>
<p class='p'>标签选择器、类选择器、ID选择器</p>
<a href="https://www.baidu.com" title="百度搜索">百度一下</a>
<span> 我是一个span标签</span>
<div id="map">
<p class="content">早上祝您端午节快乐!</p>
</div>
<span id="map">
<p class="content">晚上祝您端午节快乐!</p>
</span>
<span id="text">你好,我是一行文字</span>
</body>
</html>
"""
选择器使用 | 例 |
---|---|
标签选择器 | 选取所有的p标签: p_tags = selector.css(‘p’) |
class选择器 | 选择所有class为content的标签: tags = selector.css(‘.content’) |
id选择器 | 选取id为text的所有标签: text = selector.css(‘#text’) |
属性提取器 | 分别提取a标签中的href和title属性值: href_value = selector.css(‘a::attr(href)’).get() title_value = selector.css(‘a::attr(title)’).get() |
属性选择器 | 提取文字: string = selector.css(‘#text::text’).get() |
类选择器和id选择器搭配使用 | id为map的标签内的p标签,且p标签的class为content,提取出该标签的文字: content = selector.css(‘#map p.content::text’).getall() |
子选择器和子孙选择器 | map > p 是选择 id为map 的标签儿子标签的 p标签,只检测 id为map 的标签内的第一层 |
map p 是选择 id为map 的标签所有子孙标签中的p标签,检测 id为map 的标签内的所有标签 |
代码实现
# coding:utf-8
# @Time :2023/5/31 19:28
# @Author :moxiao
import requests # 发送请求
import parsel
import pymysql
result=[]
likes= []
headers = {
'Cookie':'_forum_session=ILJoes9uNuh8LIPgh2aGvt2W%2Fz2lnT3OFI09Xx4mDmXXqOn%2B2RfM5tMic2kKrljNBGbLMr1BG4G%2B%2BYpkzSJhtRLNwks25Jy98kZr66M%2Bx7ETGKUrjcsz2UU0OCOFAvfAMYNU5nIa8Z4WDIU7a%2BqvL3fgJPSV2oytmvqG3dDYcc8whyNycRz5v%2BHEsDqDwvMYaIqoFrPVJ4xizzQm9HNHVM%2B%2BF8TTNAO4c8KR1fP%2BLFjoNXPvTdj3OU3r8oh31vfa6C2wGiH1snj8yt36PZ73THk70AAynEiWuWyBmnfcuIbibMjWZkPUGhR6ascssnNdVt4hfIEl35MJnSyCtH0qVTY1Cb%2BQLUkIatyI%2FvaXFwRtOEf7npLV2RWI3RAk93UxsXP4VEifZHuvEzZtJ%2BjXaXr5SPqTcWCSlAgvjSjFr%2BeGz6%2BxweSKmwATpiPwwAauh18aAVX6LvRnNW7VaFO9hTNfF03IuI527c%2FqLTTloNWamltsPbYHuP3r8Ka1a62yrut7%2BZuAcYNSM9ANjXiyUuX3L5Av8mFb9wOxFGljbtq0RLxvAoQybR7H4NVTYi1w%2Bj3%2BZ3SnJVeGEhsrmr%2FcYaGBBcfRdcqrJrV4rGc09de7qUb6R0PE6Y9SmhWMnsFLZwD1rK85eOpdG%2F65YayReBGWCFeP0uPBIxNgRCZ3CE4ysZ7DLuBLhu7tKmdGfheRajYTRcEChF2HMmHaDK%2F8%2FcO%2BB6qWR19KhFH9eAOo4QKyTdsmsinrrQXICcwR8k67uN4CHmMhQcb08MbHVZ%2BQt19XeMmTCMOxumvWn3FDG0CvO2RcQLnZa0VSg77yxYqpHiElJaDLZEhGiFa0FwNZSlzC5TOUny1Gw59OUkeyQl%2BR%2Bevs6rEgSHiM%2BTBuk4i9iuoMQ1wJatYNDAe%2FRUzcog7Z4afLhXK%2BNn2pY3byJI5ojogZLxs3xnzxZ6rXvEwG8gU%3D--OiQw%2F9S5de49Tr6S--4eZimX4dJI70zvWB4ENPbg%3D%3D; path=/; secure; HttpOnly; SameSite=Lax',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
}
url ='https://forum.90sec.com/'
response = requests.get(url=url, headers=headers)
responses = response.text.encode('utf-8').decode('utf-8')
# print(responses)
selector = parsel.Selector(responses)
author = selector.css('.posters img::attr(title)').getall()#.item-0.active a::attr(href)
replies = selector.css('.replies span::text').getall()
views = selector.css('.views span::text').getall()
links = selector.css('.link-top-line a::attr(href)').getall()
for link in links:
url1 = link
print(url1)
res = requests.get(url=url1, headers=headers)
res1 = res.text.encode('utf-8').decode('utf-8')
# print(res1)
selector = parsel.Selector(res1)
like = selector.css('.post-likes::text').get()
likes.append(like)
print("{:^20}{:^10}{:^5}{:^8}".format("作者用户名","回复量","浏览量","点赞量"))
"""测试
# for i in range(25):
# result.append([author[i], replies[i], views[i], likes])
# for a in range(25):
# u=result[a]
# print("{:^20}{:^10}{:^5}{:^8}".format(u[0],u[1],u[2],u[3]))
"""
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='root123',
database='test',
port=3306,
charset='utf8')
# 建立游标
cursor = conn.cursor()
# (1)定义一个格式化的sql语句
sql = 'insert into qiushibaike(`username`,`reply`,`view`,`like`) values(%s,%s,%s,%s);'
for i in range(25):
result.append((author[i], replies[i], views[i], likes[i]))
for a in range(25):
u=result[a]
cursor.execute(sql, u)
conn.commit()
cursor.close()
# 关闭连接
conn.close()