爬虫
爬虫是利用程序进行批量爬取网页上的公开信息,也就是前端显示的数据信息。因为信息是完全公开的,所以是合法的。其实就像浏览器一样,浏览器解析响应内容并渲染为页面,而爬虫解析响应内容采集想要的数据进行存储。
爬虫有什么用
通过有效的爬虫手段批量采集数据,可以降低人工成本,提高有效数据量,给予运营/销售的数据支撑,加快产品发展。(这也就是有的时候你刚找完什么东西,大数据就给你推什么东西的原因之一)
爬虫实例
import urllib3
import requests
from lxml import etree
list = []
# 消除InsecureRequestWarning警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 实例化产生请求对象
http = urllib3.PoolManager()
# get请求指定网址
url = "目标网址"
for j in range(0, 138):
res = http.request("GET", url)
# 获取响应内容
data = res.data.decode("utf-8")
# 正则解析并输出
# print(re.findall("<title>(.*?)</title>", data))
html = etree.HTML(data, etree.HTMLParser())
result = html.xpath('//li[@style="line-height:40px;"]/a')
ees = html.xpath('//li[@style="line-height:40px;"]/a/@href')
sse = html.xpath('//span[@class="fr"]')
for i in range(len(result)):
list.append(result[i].text + "-----" + sse[i].text + "_______:" + '网址' + ees[i])
#print(result[i].text + "-----" + sse[i].text + "_______:" + '网址' + ees[i])
url = "网址" + str(j) + ".htm"
for a in range(len(list)):
print(list[a])
代码呢大概就是这个样子,这是一个爬取学校官网新闻的一个实例,具体哪个学校我就不提了(网站就是那个目标网址),可以拿自己学校的官网试一下(但不建议哦)
就是需要用到上面那三个包(urllib3 ,requests ,lxml),来进行的。在运行之后可能会有InsecureRequestWarning这个警告,urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)可以消除警告,爬虫还要回HTML基础,能看得懂HTML语言。主要就是把爬取出来的分散的数据存到列表里面拼接成一个完整的数据,第一个for循环是遍历新闻的总页数(这个就需要自己去网站上看了),接着就是用浏览器打卡网站,按F12找到所对应的标签,根据标签去定位。然后把对应的标签写到程序里面。最后再用字符串拼接输入到例表里面,在控制台输出。
这样只能在控制台看得到并没有把数据进行保存,那么把程序关掉之后就看不到了,数据可以保存在数据库、word、excel、txt、json等类型,下面再介绍一种保存在数据库中的一种方式。
import urllib3
import mysql.connector
import re
from lxml import etree
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 实例化产生请求对象
try:
http = urllib3.PoolManager()
list = []
# get请求指定网址
url = "目标网址"
# 连接数据库
mydb = mysql.connector.connect(
host="127.0.0.1",
user="root",
passwd="123456",
database="python",
buffered=True
)
# 数据库驱动
mycursor = mydb.cursor()
# 查看库
mycursor.execute("SHOW DATABASES")
# 创建表
# mycursor.execute("CREATE TABLE xinwen (name VARCHAR(255), time VARCHAR(255), url VARCHAR(255))")
for a in range(138, 0, -1):
res = http.request("GET", url)
# 获取响应内容
data = res.data.decode("utf-8")
html = etree.HTML(data, etree.HTMLParser())
# 获取标题
result = html.xpath('//li[@style="line-height:40px;"]/a')
# 获取链接
urll = html.xpath('//li[@style="line-height:40px;"]/a/@href')
# 获取时间
timee = html.xpath('//span[@class="fr"]')
# 进行遍历
for x in range(len(result)):
# 循环遍历添加新闻:标题,时间,网址
sql = "INSERT INTO xinwen (name, time, url) VALUES (%s, %s, %s)"
val = (result[x].text, timee[x].text, "网址" + urll[x])
mycursor.execute(sql, val)
# 进行更新
mydb.commit()
url = "网址" + str(a) + ".htm"
for x in range(len(list)):
print(list[x])
finally:
# 关闭数据库
mydb.close()
可以看出和那个普通版的没什么区别,就是增加了几条SQL语句用来添加到数据库里面。
在python里面使用SQL语句需要加载数据库驱动,我用的是MySQL,就以MySQL为例pip install mysql-connector或者pip install pymysql,这两个任何一个都行但加载驱动的语句不一样。