官方数据:【Python入门只需20分钟】从安装到数据抓取、存储原来这么简单

优采云 发布时间: 2022-09-23 09:16

  官方数据:【Python入门只需20分钟】从安装到数据抓取、存储原来这么简单

  基于大众对 Python 的炒作和欣赏,作为一名 Java 从业者,怀着批判和好奇的心态,我买了 Python 书籍《Learn Python without Barriers》。我刚刚读了本书的第一部分......我决定成为一个 python 粉丝。

  作为一个合格的脑残粉(标题党(ノ◕ω◕)ノ),为了我的线下开发,我会详细介绍Python安装到开发工具的简单介绍,并写一个catch的例子天气信息数据并将其存储在数据库中。 (此文章适用于完全不懂Python的小白超级超级超级快速入门者)

  如果你有时间,强烈建议跟着,因为介绍真的很详细。

  Python 安装

  下载Python:官网地址:

  选择你要下载的版本(都可以),是否为64位。选择下载文件类型时,建议下载安装包,因为安装时会自动为您分配环境路径。 (下载过程中可以下载python开发工具PyCharm,简单了解Python)

  安装注意事项:勾选Add Python x.x to Path

  安装完成后,打开cmd,输入python,如果出现提示,完成。

  PyCharm 安装

  PyCharm下载:官网地址:

  免费版可能缺少一些功能,所以不推荐,所以这里我们选择下载企业版。

  安装PyCharm后,首次打开时可能需要输入邮箱地址或输入激活码获取激活码

  PyCharm的基本使用,可以简单看看这篇博客

  获取天气信息

  Python的基本语法推荐看网上的一些教程:菜鸟教程

  详细学习 Python 需要一些时间。如果你有其他语言的经验,可以跟着我暂时写一个简单的例子。

  我们计划采集的数据:杭州的天气信息,你可以先看看这个网站了解杭州的天气。

  实现数据抓取的逻辑:使用python请求一个URL会返回对应的HTML信息。我们解析 HTML 以获取我们需要的数据。 (很简单的逻辑)

  第 1 步:创建 Python 文件

  编写第一段 Python 代码

  if __name__ == '__main__':

   url = 'http://www.weather.com.cn/weather/101210101.shtml'

   print('my frist python file')

  此代码类似于 Java 中的 Main 方法。可以直接右键选择运行。

  第 2 步:请求 RUL

  python的强大之处在于它拥有大量可以直接使用的模块(类似于Java jar包)。

  我们需要安装一个请求模块:File - Setting - Product - Product Interpreter

  如上图所示点击+号安装Python模块。搜索 requests 模块(带有 s oh),然后单击 Install。

  顺便说一下,我们将安装一个 beautifulSoup4 和 pymysql 模块。 beautifulSoup4 模块用于解析 html 并可以将 HTML 字符串对象化。 pymysql模块用于连接mysql数据库。

  相关模块安装完成后,就可以愉快的打代码了。

  定义一个 getContent 方法:

  # 导入相关联的包

import requests

import time

import random

import socket

import http.client

import pymysql

from bs4 import BeautifulSoup

def getContent(url , data = None):

   header={

       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',

       'Accept-Encoding': 'gzip, deflate, sdch',

       'Accept-Language': 'zh-CN,zh;q=0.8',

       'Connection': 'keep-alive',

       'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'

   } # request 的请求头

   timeout = random.choice(range(80, 180))

   while True:

       try:

           rep = requests.get(url,headers = header,timeout = timeout) #请求url地址,获得返回 response 信息

           rep.encoding = 'utf-8'

           break

       except socket.timeout as e: # 以下都是异常处理

           print( '3:', e)

           time.sleep(random.choice(range(8,15)))

       except socket.error as e:

           print( '4:', e)

           time.sleep(random.choice(range(20, 60)))

       except http.client.BadStatusLine as e:

           print( '5:', e)

           time.sleep(random.choice(range(30, 80)))

       except http.client.IncompleteRead as e:

           print( '6:', e)

           time.sleep(random.choice(range(5, 15)))

   print('request success')

   return rep.text # 返回的 Html 全文

  在main方法中调用:

  if __name__ == '__main__':

   url ='http://www.weather.com.cn/weather/101210101.shtml'

   html = getContent(url) # 调用获取网页信息

   print('my frist python file')

  第 3 步:分析页面数据

  定义一个getData方法:

  def getData(html_text):

   final = []

   bs = BeautifulSoup(html_text, "html.parser")  # 创建BeautifulSoup对象

   body = bs.body #获取body

   data = body.find('div',{'id': '7d'})

   ul = data.find('ul')

   li = ul.find_all('li')

   for day in li:

       temp = []

       date = day.find('h1').string

       temp.append(date) #添加日期

       inf = day.find_all('p')

       weather = inf[0].string #天气

       temp.append(weather)

       temperature_highest = inf[1].find('span').string #最高温度

       temperature_low = inf[1].find('i').string  # 最低温度

       temp.append(temperature_low)

     temp.append(temperature_highest)

       final.append(temp)

   print('getDate success')

   return final

  上面的解析其实是基于HTML的规则。你可以在开发者模式下打开杭州天气(F12),看看页面的元素分布情况。

  在main方法中调用:

  

  if __name__ == '__main__':

   url ='http://www.weather.com.cn/weather/101210101.shtml'

   html = getContent(url)    # 获取网页信息

   result = getData(html)  # 解析网页信息,拿到需要的数据

   print('my frist python file')

  将数据写入excel

  既然我们在 Python 中有了想要的数据,就可以先把数据存储起来,比如把数据写入 csv。

  定义一个 writeDate 方法:

  import csv #导入包

def writeData(data, name):

   with open(name, 'a', errors='ignore', newline='') as f:

           f_csv = csv.writer(f)

           f_csv.writerows(data)

   print('write_csv success')

  在main方法中调用:

  if __name__ == '__main__':

   url ='http://www.weather.com.cn/weather/101210101.shtml'

   html = getContent(url)    # 获取网页信息

   result = getData(html)  # 解析网页信息,拿到需要的数据

   writeData(result, 'D:/py_work/venv/Include/weather.csv') #数据写入到 csv文档中

   print('my frist python file')

  执行后,指定路径下会多出一个weather.csv文件,可以打开查看。

  这里最简单的数据采集——存储完成。

  数据写入数据库

  由于数据一般都存储在数据库中,所以我们以mysql数据库为例,尝试往我们的数据库中写入数据。

  第一步是创建 WEATHER 表:

  建表可以直接在mysql客户端进行,也可以在python中建表。这里我们使用python创建一个WEATHER表。

  定义一个createTable方法:(import pymysql之前已经导入过,如果没有,需要导入包)

  def createTable():

   # 打开数据库连接

   db = pymysql.connect("localhost", "zww", "960128", "test")

   # 使用 cursor() 方法创建一个游标对象 cursor

   cursor = db.cursor()

   # 使用 execute()  方法执行 SQL 查询

   cursor.execute("SELECT VERSION()")

   # 使用 fetchone() 方法获取单条数据.

   data = cursor.fetchone()

   print("Database version : %s " % data) # 显示数据库版本(可忽略,作为个栗子)

   # 使用 execute() 方法执行 SQL,如果表存在则删除

   cursor.execute("DROP TABLE IF EXISTS WEATHER")

   # 使用预处理语句创建表

   sql = """CREATE TABLE WEATHER (

            w_id int(8) not null primary key auto_increment,

            w_date  varchar(20) NOT NULL ,

            w_detail  varchar(30),

            w_temperature_low varchar(10),

            w_temperature_high varchar(10)) DEFAULT CHARSET=utf8"""  # 这里需要注意设置编码格式,不然中文数据无法插入

   cursor.execute(sql)

   # 关闭数据库连接

   db.close()

  print('create table success')

  在main方法中调用:

  if __name__ == '__main__':

   url ='http://www.weather.com.cn/weather/101210101.shtml'

   html = getContent(url)    # 获取网页信息

   result = getData(html)  # 解析网页信息,拿到需要的数据

   writeData(result, 'D:/py_work/venv/Include/weather.csv') #数据写入到 csv文档中

   createTable() #表创建一次就好了,注意

   print('my frist python file')

  执行后,查看数据库,查看天气表是否创建成功。

  第二步,批量写入WEATHER表数据:

  定义一个 insertData 方法:

  def insert_data(datas):

   # 打开数据库连接

   db = pymysql.connect("localhost", "zww", "960128", "test")

   # 使用 cursor() 方法创建一个游标对象 cursor

   cursor = db.cursor()

   try:

       # 批量插入数据

       cursor.executemany('insert into WEATHER(w_id, w_date, w_detail, w_temperature_low, w_temperature_high) value(null, %s,%s,%s,%s)', datas)

       # sql = "INSERT INTO WEATHER(w_id, \

       #                w_date, w_detail, w_temperature) \

       #                VALUES (null, '%s','%s','%s')" % \

       #       (data[0], data[1], data[2])

       # cursor.execute(sql)    #单条数据写入

       # 提交到数据库执行

       db.commit()

   except Exception as e:

       print('插入时发生异常' + e)

       # 如果发生错误则回滚

       db.rollback()

   # 关闭数据库连接

   db.close()

  在main方法中调用:

  if __name__ == '__main__':

   url ='http://www.weather.com.cn/weather/101210101.shtml'

   html = getContent(url)    # 获取网页信息

   result = getData(html)  # 解析网页信息,拿到需要的数据

   writeData(result, 'D:/py_work/venv/Include/weather.csv') #数据写入到 csv文档中

   # createTable() #表创建一次就好了,注意

   insertData(result) #批量写入数据

   print('my frist python file')

  检查:执行完这条Python语句后,查看数据库是否有写入数据。如果有的话,你就完成了。

  在此处查看完整代码:

   # 导入相关联的包

import requests

import time

import random

import socket

import http.client

import pymysql

from bs4 import BeautifulSoup

import csv

def getContent(url , data = None):

   header={

       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',

<p>

       'Accept-Encoding': 'gzip, deflate, sdch',

       'Accept-Language': 'zh-CN,zh;q=0.8',

       'Connection': 'keep-alive',

       'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'

   } # request 的请求头

   timeout = random.choice(range(80, 180))

   while True:

       try:

           rep = requests.get(url,headers = header,timeout = timeout) #请求url地址,获得返回 response 信息

           rep.encoding = 'utf-8'

           break

       except socket.timeout as e: # 以下都是异常处理

           print( '3:', e)

           time.sleep(random.choice(range(8,15)))

       except socket.error as e:

           print( '4:', e)

           time.sleep(random.choice(range(20, 60)))

       except http.client.BadStatusLine as e:

           print( '5:', e)

           time.sleep(random.choice(range(30, 80)))

       except http.client.IncompleteRead as e:

           print( '6:', e)

           time.sleep(random.choice(range(5, 15)))

   print('request success')

   return rep.text # 返回的 Html 全文

def getData(html_text):

   final = []

   bs = BeautifulSoup(html_text, "html.parser")  # 创建BeautifulSoup对象

   body = bs.body #获取body

   data = body.find('div',{'id': '7d'})

   ul = data.find('ul')

   li = ul.find_all('li')

   for day in li:

       temp = []

       date = day.find('h1').string

       temp.append(date) #添加日期

       inf = day.find_all('p')

       weather = inf[0].string #天气

       temp.append(weather)

       temperature_highest = inf[1].find('span').string #最高温度

       temperature_low = inf[1].find('i').string  # 最低温度

       temp.append(temperature_highest)

       temp.append(temperature_low)

       final.append(temp)

   print('getDate success')

   return final

def writeData(data, name):

   with open(name, 'a', errors='ignore', newline='') as f:

           f_csv = csv.writer(f)

           f_csv.writerows(data)

   print('write_csv success')

def createTable():

   # 打开数据库连接

   db = pymysql.connect("localhost", "zww", "960128", "test")

   # 使用 cursor() 方法创建一个游标对象 cursor

   cursor = db.cursor()

   # 使用 execute()  方法执行 SQL 查询

   cursor.execute("SELECT VERSION()")

   # 使用 fetchone() 方法获取单条数据.

   data = cursor.fetchone()

   print("Database version : %s " % data) # 显示数据库版本(可忽略,作为个栗子)

   # 使用 execute() 方法执行 SQL,如果表存在则删除

   cursor.execute("DROP TABLE IF EXISTS WEATHER")

   # 使用预处理语句创建表

   sql = """CREATE TABLE WEATHER (

            w_id int(8) not null primary key auto_increment,

            w_date  varchar(20) NOT NULL ,

            w_detail  varchar(30),

            w_temperature_low varchar(10),

            w_temperature_high varchar(10)) DEFAULT CHARSET=utf8"""

   cursor.execute(sql)

   # 关闭数据库连接

   db.close()

   print('create table success')

def insertData(datas):

   # 打开数据库连接

   db = pymysql.connect("localhost", "zww", "960128", "test")

   # 使用 cursor() 方法创建一个游标对象 cursor

   cursor = db.cursor()

   try:

       # 批量插入数据

       cursor.executemany('insert into WEATHER(w_id, w_date, w_detail, w_temperature_low, w_temperature_high) value(null, %s,%s,%s,%s)', datas)

       # 提交到数据库执行

       db.commit()

   except Exception as e:

       print('插入时发生异常' + e)

       # 如果发生错误则回滚

       db.rollback()

   # 关闭数据库连接

   db.close()

   print('insert data success')

if __name__ == '__main__':

   url ='http://www.weather.com.cn/weather/101210101.shtml'

   html = getContent(url)    # 获取网页信息

   result = getData(html)  # 解析网页信息,拿到需要的数据

   writeData(result, 'D:/py_work/venv/Include/weather.csv') #数据写入到 csv文档中

   # createTable() #表创建一次就好了,注意

   insertData(result) #批量写入数据

   print('my frist python file')</p>

  Python安装到数据采集、存储等都完成了。当然,这只是最简单的入口。如果你还对 Python 感兴趣,希望你能系统地学习。

  Python 爱好者社区的历史文章大合集:

  福利:扫描文末二维码,立即关注“Python爱好者社区”公众号,开始学习Python课程:

  操作方法:解读Baiduspider抓取系统的原理与索引建库【seo网站免费教程】

  原文文章转载地址:/invest/202101/18/223615.html

  关于百度搜索引擎的工作原理,很多站长SEO都没有仔细阅读和理解。本文解读Baiduspider爬取系统的原理及建索引,让SEOer为百度蜘蛛的收录索引建库了解详情。

  一、蜘蛛爬取系统的基本框架

  互联网信息爆炸式增长,如何有效地获取和使用这些信息是搜索引擎工作中的首要环节。数据爬取系统作为整个搜索系统的上游,主要负责互联网信息的采集、存储和更新。它像蜘蛛一样在网络中爬行,因此通常被称为“蜘蛛”。比如我们常用的几种常见的搜索引擎蜘蛛叫做:Baiduspdier、Googlebot、搜狗网络蜘蛛等。

  蜘蛛爬取系统是搜索引擎数据来源的重要保障。如果把网络理解为一个有向图,那么蜘蛛的工作过程可以认为是对这个有向图的遍历。从一些重要的*敏*感*词*URL开始,通过页面上的超链接关系,不断发现新的URL并进行爬取,从而尽可能多地爬取有价值的网页。对于百度这样的大型爬虫系统,由于随时都有网页被修改、删除或者新的超链接出现的可能,所以需要保持蜘蛛过去爬过的页面保持更新,维护一个URL库和Page图书馆。

  下图是蜘蛛爬取系统的基本框架图,包括链接存储系统、链接选择系统、dns解析服务系统、爬取调度系统、网页分析系统、链接提取系统、链接分析系统、网页存储系统。百度蜘蛛通过本系统的配合完成对互联网页面的抓取。

  二、Baiduspider的主要爬取策略类型

  

  上图看似简单,但实际上百度蜘蛛在爬取过程中面临着一个超级复杂的网络环境。同时不会对网站体验造成压力,会设计多种复杂的抓取策略。这里简单介绍一下:

  1. 抓取友好度

  互联网资源是数量级的巨大,这就要求爬虫系统尽可能高效地利用带宽,在有限的硬件和带宽资源下尽可能多地抓取有价值的资源。这就产生了另一个问题,消耗了被逮捕的 网站 的带宽并造成访问压力。如果太大,将直接影响被捕网站的正常用户访问行为。因此,需要在爬取过程中控制爬取压力,以达到在不影响网站的正常用户访问的情况下尽可能多地抓取有价值资源的目的。

  通常,最基本的是基于ip的压力控制。这是因为如果是基于域名的话,可能会出现一个域名对应多个ip(很多大网站)或者多个域名对应同一个ip(小网站共享)的问题ip)。在实践中,往往根据ip和域名的各种情况进行压力分配控制。同时,站长平台也推出了压力反馈工具。站长可以自己手动调节抓取压力网站。此时百度蜘蛛会根据站长的要求优先控制抓取压力。

  对同一个站点的爬取速度的控制,一般分为两类:一、一段时间内的爬取频率;另一种是一段时间内的爬行流量。同一个站点在不同时间的爬取速度会有所不同。例如,在夜深人静、月黑风高的情况下,爬行可能会更快。它还取决于特定的站点类型。主要思想是错开正常的用户访问高峰并不断进行调整。不同的网站也需要不同的抓取速度。

  三、判断新链接的重要性

  在建库之前,Baiduspider会对页面进行初步的内容分析和链接分析,通过内容分析判断页面是否需要建索引库,通过链接分析发现更多页面,然后爬取更多页面——分析- 是否建立图书馆和发现新链接的过程。理论上,百度蜘蛛会把新页面上所有能“看到”的链接都爬回来,那么面对众多的新链接,百度蜘蛛如何判断哪个更重要呢?两个方面:

  首先,用户的价值内容是独一无二的。百度搜索引擎喜欢具有突出主体的独特内容。不要显得网页的主要内容不突出,被搜索引擎误判为空缺的页面。不抓取内容丰富的广告是合适的。 , 链接重要性目录层次结构 - 网站内浅优先级链接的流行度

  

  四、百度优先建设重要库的原则

  百度蜘蛛抓取多少页并不是最重要的,重要的是建了多少页到索引库中,也就是我们常说的“建库”。众所周知,搜索引擎的索引库是分层的。高质量的网页将分配到重要的索引库,普通网页将留在普通库,较差的网页将分配到低级库作为补充资料。目前60%的检索需求只需要调用重要的索引库就可以满足,这就解释了为什么有些网站的收录的大流量并不理想。

  那么,哪些页面可以进入优质索引库呢?其实,总的原则是一个:对用户有价值。包括但不限于:

  时间敏感且有价值的页面:在这里,及时性和价值并列,两者缺一不可。有些网站为了生成时间敏感的内容页面做了很多采集的工作,导致一堆毫无价值的页面,百度不想看到。优质内容的专题页:专题页的内容不一定是完全的原创,也就是可以很好的融合各方的内容,或者加入一些新鲜的内容,比如意见、评论等,给予为用户提供更丰富、更全面的内容。高价值的原创内容页面:百度将原创定义为花费一定成本,积累大量经验后形成的文章。永远不要再问我们是否 伪原创 是原创。重要的个人页面:这里只是一个例子,科比在新浪微博上开了一个账号,即使他不经常更新,对于百度来说仍然是一个非常重要的页面。五、哪些网页不能建入索引库

  上面提到的优质网页都进入了索引库,所以其实网上的大部分网站都没有被百度收录列出来。不是百度没找到,而是建库前的筛选过程中被过滤掉了。那么第一个链接就过滤掉了什么样的网页:

  内容重复的网页:百度不需要收录与互联网上已有的内容。主要内容为空且短的网页

  部分作弊页面

  更多关于aiduspider爬取系统的原理和索引搭建,请到百度站长论坛查看文档。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线