一、链接分析:

以"Linux"为搜索的关键字为例:

首页的链接为:https://zhidao.baidu.com/search?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=linux

第二页的链接为:https://zhidao.baidu.com/search?word=linux&ie=gbk&site=-1&sites=0&date=0&pn=10

第三页的链接为:https://zhidao.baidu.com/search?word=linux&ie=gbk&site=-1&sites=0&date=0&pn=20

链接可以统一为:https://zhidao.baidu.com/search?word= + 关键字 + &ie=gbk&site=-1&sites=0&date=0&pn= + (页面数-1)*10

即使首页也可以这样写,只需要将最后的pn的值定为0,。

这样,我们只需要获取页面的最大页面数,然后遍历处理就可以。

二、分析首页页面:

我们可以看到,在索引界面中有问题和问题的答案,此外还有提问时间和答案贡献者,但这些我在这里暂时不爬取,有兴趣的可以去试试。问题的描述一般是完整的但答案的描述就不一定了。

而在详情页两者的描述都很完整,因此为方便起见,我们统一在详情页获取问题和答案,这就需要在索引页获取详情页的URL。

通过分析很容易知道,详情页的URL在

这个块中,并且在其中每个的 class="ti" 的a标签的href属性的值就是我们要的URL。

很容易获取,这里我们使用BeautifulSoup来提取。主要的代码如下:

defGet_URL(html):#从html源码中解析出url并返回,传入参数为html源码,返回URL列表

Soup = BeautifulSoup(html,'lxml')

info= Soup.select('.list-inner')

info= info[0].select('.ti')return [i['href'] for i in info]

三、从详情页获取问题和答案:

详情页的问题的描述一般有两种形式:一种是普通问题,放在 这个块中,提取里面的文本就是问题的描述了;一种是作业帮的问题,放在   这个块中,提取里面的文本就是问题的描述了。

问题的答案也分上述两种,放在

 块中的一般问题的答案和放在 

块中的作业帮的问题的答案。

当然,你也可以有不同的获取方式,只要最终能得到信息的存放的位置就可以。知道信息的位置,很容易写代码获取。

defGet_info(url):#进入详情页获取问题和答案,传入URL,返回问题和答案

res = requests.get(url, headers =header)

res.encoding= 'gbk'Soup= BeautifulSoup(res.text,'lxml')try:

info= Soup.select('pre[accuse="aContent"]')if len(info) < 1:#print(url)

info = Soup.select('div[accuse="aContent"]')if len(info) < 1:

info= Soup.select('dt[class="title"]')

info=info[0].textexcept:

info= ''

print('获取回答失败,对应的URL为:',url)try:

ask= Soup.select('.ask-title')if len(ask) < 1:

ask= Soup.select('.qb-content')

ask=ask[0].textexcept:

ask= ''

print('获取标题失败,对应的URL为:',url)return ask,info

四、存入数据库:

说实话,爬取数据我一个早上就写完了,但是存入数据库中花了三天时间。主要是数据库的知识忘得差不多了,毕竟自从学完后基本没什么机会用。

这里我们使用了Python操纵数据库的一个模块PyMySQL,不清楚的小伙伴可以参考这里:Python+MySQL数据库操作(PyMySQL)。

当然前提是你懂得MySQL,如果这个你也不是很了解,可以先看看这个:MySQL教程

首先,我们创建一个数据库的表test.Data来存储数据,执行下面代码之前请确认:

已经创建了一个数据库:test

MySQL用户"guest"和密码"12345"可以访问test数据库

具体代码如下:

def Create_table(name = 'Data'):#传入数据库的名称,创建数据库,数据库一共有三列:问题id、问题和答案

db= pymysql.connect("localhost","guest","12345","test", use_unicode=True, charset="utf8")#db.set_character_set('utf8')

cursor =db.cursor()

sql_1= "drop table if exists" +name

sql_2= """create table %s(

id int(100) not null auto_increment,

question text(10000) not null,

answer text(10000) default NULL,

PRIMARY KEY (`id`)

)engine=InnoDB default charset=utf8;""" %name

cursor.execute(sql_1)#print(sql_2)

cursor.execute(sql_2)returndbdefLoad_date(db,date):#将date数据插入数据库

cursor =db.cursor()

sql= """insert into Date(question,answer) values(%s,%s);""" %(date[0],date[1])#print(sql)

cursor.execute(sql)

db.commit()

完整的代码如下:

importrequestsimportrefrom bs4 importBeautifulSoupimporttimeimportpymysqlimportsys

url_1= "https://zhidao.baidu.com/search?word="url_2= "&ie=gbk&site=-1&sites=0&date=0&pn="header= {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36'}def Get_html(keyword, number =0):#输入关键字,获取得到结果的数量和源码

#如果是首页,返回首页的HTML源码和最大页数;如果不是,则只返回HTML源码

url= url_1 + keyword + url_2 +str(number)#print(url)

res = requests.get(url = url, headers =header)

res.encoding= 'gbk'html=res.textif number ==0:

reg= r'尾页'reg=re.compile(reg)

number=re.findall(reg,html)[0]returnhtml,numberelse:returnhtmldefGet_URL(html):#从html源码中解析出url并返回

Soup = BeautifulSoup(html,'lxml')

info= Soup.select('.list-inner')

info= info[0].select('.ti')return [i['href'] for i ininfo]defGet_info(url):#传入详情页的URL,进入详情页获取问题和答案并返回

res= requests.get(url, headers =header)

res.encoding= 'gbk'Soup= BeautifulSoup(res.text,'lxml')#详情页的问题和答案一共有三种情况,一是普通问题,二是作业帮的问答问题,三是丢失的问答

try:

info= Soup.select('pre[accuse="aContent"]')if len(info) < 1:#print('不在pre[accuse="aContent"]')

info = Soup.select('div[accuse="aContent"]')if len(info) < 1:

info= Soup.select('dt[class="title"]')

info=info[0].textexcept:

info= ''

print('获取回答失败,对应的URL为:',url)try:

ask= Soup.select('.ask-title')if len(ask) < 1:

ask= Soup.select('.qb-content')

ask=ask[0].textexcept:

ask= ''

print('获取标题失败,对应的URL为:',url)returnask,infodef Create_table(name = 'Data'):#传入数据库的名称,创建数据库,数据库一共有三列:问题id、问题和答案

db= pymysql.connect("localhost","guest","12345","test", use_unicode=True, charset="utf8")#db.set_character_set('utf8')

cursor =db.cursor()

sql_1= "drop table if exists" +name

sql_2= """create table %s(

id int(100) not null auto_increment,

question text(10000) not null,

answer text(10000) default NULL,

PRIMARY KEY (`id`)

)engine=InnoDB default charset=utf8;""" %name

cursor.execute(sql_1)#print(sql_2)

cursor.execute(sql_2)returndbdefLoad_date(db,date):#将date数据插入数据库

#db = pymysql.connect("localhost","guest","12345","test", use_unicode=True, charset="utf8")

cursor =db.cursor()

sql= """insert into Date(question,answer) values(%s,%s);""" %(date[0],date[1])#print(sql)

cursor.execute(sql)

db.commit()defmain():#主调函数,负责调度其他辅助函数

#主要流程如下:

#根据获取的关键字,得到首页的HTML源码和最大页数

#从源码中获取详情页的URL

#然后创建数据库用来保存爬取的数据

#遍历详情页的URL,获取问题和答案,并将获得的数据插入数据库

keyword= '标书'[html,number]=Get_html(keyword)print("总共有%s页的结果!" %str(number))

URL=Get_URL(html)

db=Create_table()for u inURL:#print(u)

[ask,answer] =Get_info(u)if len(ask) > 1:

ask= """'%s'""" %ask

answer= """'%s'""" %answer

date=[ask,answer]

Load_date(db,date)

time.sleep(1)print("首页获取完毕!")

time.sleep(3)for i in range(1,int(int(number)/10+1)):

html= Get_html(keyword,i*10)

URL=Get_URL(html)for u inURL:#print(u)

[ask,answer] =Get_info(u)if len(ask) > 1:

ask= """'%s'""" %ask

answer= """'%s'""" %answer

date=[ask,answer]

Load_date(db,date)

time.sleep(1)print("第" + str(i+1) + "页获取完毕!")

time.sleep(3)

db.close()if __name__ == '__main__':

main()

python 爬取百度知道_python3爬取百度知道的问答并存入数据库(MySQL)相关推荐

  1. python爬虫百度图片_python3爬取百度图片(2018年11月3日有效)

    最终目的:能通过输入关键字进行搜索,爬取相应的图片存储到本地或者数据库 首先打开百度图片的网站,搜索任意一个关键字,比如说:水果,得到如下的界面 分析: 1.百度图片搜索结果的页面源代码不包含需要提取 ...

  2. python网页数据存入数据库_python网络爬虫抓取动态网页并将数据存入数据库MySQL...

    简述 以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网 ...

  3. python网站数据写入mysql_python网络爬虫抓取动态网页并将数据存入数据库MySQL

    简述 以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网 ...

  4. python最简单的爬取邮箱地址_python3爬取网页中的邮箱地址

    1.爬虫分析 分析结果对: http://xxx.com?method=getrequest&gesnum=00000001 http://xxx.com?method=getrequest& ...

  5. 金融爬虫python网贷_爬虫之爬取网贷之家在档P2P平台基本数据并存入数据库

    python 版本 :3.5.2 Jupyter Notebook 使用库: reuqests (For human) json (用来加载JSON数据) datetime (用来记录抓取所花时间,也 ...

  6. 爬虫之爬取网贷之家在档P2P平台基本数据并存入数据库

    python 版本 :3.5.2 Jupyter Notebook 使用库: reuqests (For human) json (用来加载JSON数据) datetime (用来记录抓取所花时间,也 ...

  7. mysql把游标数据存入表中_利用Python爬股票数据并存入数据库Mysql

    直接上代码,小白也能爬股票......... import tushare as ts import mysql.connector import re,time #创建所有股票的表格以及插入每支股票 ...

  8. python股票数据库_利用Python爬股票数据并存入数据库Mysql

    直接上代码,小白也能爬股票......... import tushare as ts import mysql.connector import re,time #创建所有股票的表格以及插入每支股票 ...

  9. python + Selenium 实现自动化查询问财数据及下载Excel数据并存入到mysql

    问财的数据海量及时,作为量化交易的数据来源也是一种不错的选择,之前也用过一些免费的api,但是数据不是很完整,时效性也不高,试了一下问财觉得很不错,不过下载有次数限制,非会员每天只能导出2次,会员每天 ...

最新文章

  1. 需求的推动力-网线啥的
  2. 蛇形矩阵c 语言怎么写,蛇形矩阵输出是要怎么写代码,感觉没有眉目啊,大佬能说一下思想吗...
  3. GeneralUpdate20220323里程碑版本发布
  4. activity-启动动画的设定(下面弹出出现,弹入下面消失)
  5. 离散余弦变换原理及实现【转载】
  6. php一点通,编程一点通
  7. 微软推出面向 Kubernetes 的 OSM 项目,计划捐赠给 CNCF 基金会
  8. RS 纠删码为什么可以提高分布式存储可靠性?| 原力计划
  9. 什么是云计算时代?学云计算能做什么呢
  10. [转]DOS批处理高级教程精选合编
  11. 深度解析ElasticSearch的分布式架构原理
  12. virtualxposed使用教程_VirtualXposed
  13. Linux的文件的权限管理
  14. 淘宝商品上传API接口
  15. jQuery 之过滤选择器
  16. ArcGIS水文分析实战教程(5)细说流向与流量
  17. va_list(),va_start()
  18. ios html js调用陀螺仪,Js 获取手机陀螺仪
  19. c语言统计输入文本不同字母单词数,统计文本中单词的个数
  20. 怎么用 UDP 实现 TCP?

热门文章

  1. GameFramework使用教程
  2. 新版微信订阅号和服务号的区别
  3. 海关精准帮扶助力潮州糖果走出国门
  4. 15个你不得不知道的Chrome dev tools的小技巧
  5. hmailserver邮箱服务器,关于HmailServer邮件服务器
  6. git branch checkout理解
  7. 如何创建dao层 和dao层的实现?
  8. python成语接龙到为所欲为_ParisGabriel:Python全栈工程师(0基础到精通)教程 第十八课(递归函数、闭包)...
  9. 什么是EBC和EBO
  10. Flutter --- Dart简介