php网页抓取图片(Python爬虫()实战之爬取())
优采云 发布时间: 2022-01-23 21:13php网页抓取图片(Python爬虫()实战之爬取())
之前的传送门:
小白学Python爬虫(1):开
小白学Python爬虫(2):前期准备(一)基础类库安装)
小白学Python爬虫(3):前期准备(二)Linux基础介绍)
小白学习Python爬虫(4):前期准备(三)Docker基础介绍)
小白学Python爬虫(5):前期准备(四)数据库基础)
小白学习Python爬虫(6):前期准备(五)爬虫框架的安装)
小白学习Python爬虫(7):HTTP基础
小白学Python爬虫(8):网页基础
小白学习Python爬虫(9):爬虫基础
小白学习Python爬虫(一0):Session和Cookies
小白学Python爬虫(一1):urllib的基本使用(一)
小白学习Python爬虫(一2):urllib的基本使用(二)
小白学Python爬虫(一3):urllib的基本使用(三)
小白学习Python爬虫(14):urllib(四))的基本使用
小白学习Python爬虫(一5):urllib的基本使用(五)
小白学Python爬虫(一6):urllib实战爬虫图)
小白学习Python爬虫(一7):Requests的基本使用)
小白学Python爬虫(18):请求高级操作
小白学Python爬虫(一9):Xpath基础操作
小白学Python爬虫(20):Xpath进阶
小白学Python爬虫(二1):分析库美汤(上))
小白学Python爬虫(二2):分析库美汤(下))
小白学Python爬虫(二3):解析库pyquery简介
小白学Python爬虫(24):2019豆瓣电影排行榜
介绍
上一篇实战最后没有使用页面元素分析,感觉有点遗憾,不过最后的片单还是挺香的,真心推荐。
本次选题是先写代码再写文章,肯定可以用于页面元素分析,还需要对网站的数据加载有一定的分析,才能得到最终数据,和小编找到的两个数据源没有IP访问限制,质量有保障。绝对是小白修炼的绝佳选择。
郑重声明:本文仅供学习及其他用途。
分析
首先,要爬取*敏*感*词*,首先要知道有哪些股票。在这里,小编发现了一个网站,而这个网站有一个股票代码列表:.
打开Chrome的开发者模式,一一选择代码。具体过程这里就不贴了,同学们可以自己实现。
我们可以将所有股票代码存储在一个列表中,剩下的就是找到一个网站,然后循环获取每只股票的数据。
这个网站编辑器已经找到了,是同花顺,链接:。
聪明的同学一定都发现,这个链接里的000001就是股票代码。
接下来,我们只需要拼接这个链接,就可以不断得到我们想要的数据。
实战
首先介绍一下本次实战用到的请求库和解析库:Requests和pyquery。数据存储终于落地Mysql。
获取股票代码列表
第一步当然是建立一个股票代码列表。我们先定义一个方法:
def get_stock_list(stockListURL):
r =requests.get(stockListURL, headers = headers)
doc = PyQuery(r.text)
list = []
# 获取所有 section 中 a 节点,并进行迭代
for i in doc('.stockTable a').items():
try:
href = i.attr.href
list.append(re.findall(r"\d{6}", href)[0])
except:
continue
list = [item.lower() for item in list] # 将爬取信息转换小写
return list
把上面的链接作为参数传入,大家可以自己运行看看结果,小编这里就不贴结果了,有点长。. .
获取详细数据
详细信息的数据似乎在页面上,但实际上并不存在。最终获取数据的实际地方不是页面,而是数据接口。
http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code=000001
至于怎么找,小编这次就不多说了。还是希望所有想学爬虫的同学都能自己动手,去找找吧。多找几遍,自然会找到路。
既然有了数据接口,我们再来看看返回的数据:
showStockDate({"info":{"000001":{"name":"\u5e73\u5b89\u94f6\u884c"}},"data":{"000001":{"10":"16.13","8":"16.14","9":"15.87","13":"78795234.00","19":"1262802470.00","7":"16.12","15":"40225508.00","14":"37528826.00","69":"17.73","70":"14.51","12":"5","17":"945400.00","264648":"0.010","199112":"0.062","1968584":"0.406","2034120":"9.939","1378761":"16.026","526792":"1.675","395720":"-948073.000","461256":"-39.763","3475914":"313014790000.000","1771976":"1.100","6":"16.12","11":""}}})
显然,这个结果并不是标准的json数据,而是JSONP返回的标准格式数据。这里我们先对head和tail进行处理,变成标准的json数据,然后针对本页的数据进行解析,最后将解析后的值写入数据库。
def getStockInfo(list, stockInfoURL):
count = 0
for stock in list:
try:
url = stockInfoURL + stock
r = requests.get(url, headers=headers)
# 将获取到的数据封装进字典
dict1 = json.loads(r.text[14: int(len(r.text)) - 1])
print(dict1)
# 获取字典中的数据构建写入数据模版
insert_data = {
"code": stock,
"name": dict1['info'][stock]['name'],
"jinkai": dict1['data'][stock]['7'],
"chengjiaoliang": dict1['data'][stock]['13'],
"zhenfu": dict1['data'][stock]['526792'],
"zuigao": dict1['data'][stock]['8'],
"chengjiaoe": dict1['data'][stock]['19'],
"huanshou": dict1['data'][stock]['1968584'],
"zuidi": dict1['data'][stock]['9'],
"zuoshou": dict1['data'][stock]['6'],
"liutongshizhi": dict1['data'][stock]['3475914']
}
cursor.execute(sql_insert, insert_data)
conn.commit()
print(stock, ':写入完成')
except:
print('写入异常')
# 遇到错误继续循环
continue
这里我们添加异常处理,因为这次爬取的数据很多,很可能会因为某种原因抛出异常。当然,我们不想在出现异常的时候中断数据采集,所以在这里添加异常处理,继续采集数据。
完整代码
我们将代码稍微封装一下来完成这个实战。
import requests
import re
import json
from pyquery import PyQuery
import pymysql
# 数据库连接
def connect():
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='password',
database='test',
charset='utf8mb4')
# 获取操作游标
cursor = conn.cursor()
return {"conn": conn, "cursor": cursor}
connection = connect()
conn, cursor = connection['conn'], connection['cursor']
sql_insert = "insert into stock(code, name, jinkai, chengjiaoliang, zhenfu, zuigao, chengjiaoe, huanshou, zuidi, zuoshou, liutongshizhi, create_date) values (%(code)s, %(name)s, %(jinkai)s, %(chengjiaoliang)s, %(zhenfu)s, %(zuigao)s, %(chengjiaoe)s, %(huanshou)s, %(zuidi)s, %(zuoshou)s, %(liutongshizhi)s, now())"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
def get_stock_list(stockListURL):
r =requests.get(stockListURL, headers = headers)
doc = PyQuery(r.text)
list = []
# 获取所有 section 中 a 节点,并进行迭代
for i in doc('.stockTable a').items():
try:
href = i.attr.href
list.append(re.findall(r"\d{6}", href)[0])
except:
continue
list = [item.lower() for item in list] # 将爬取信息转换小写
return list
def getStockInfo(list, stockInfoURL):
count = 0
for stock in list:
try:
url = stockInfoURL + stock
r = requests.get(url, headers=headers)
# 将获取到的数据封装进字典
dict1 = json.loads(r.text[14: int(len(r.text)) - 1])
print(dict1)
# 获取字典中的数据构建写入数据模版
insert_data = {
"code": stock,
"name": dict1['info'][stock]['name'],
"jinkai": dict1['data'][stock]['7'],
"chengjiaoliang": dict1['data'][stock]['13'],
"zhenfu": dict1['data'][stock]['526792'],
"zuigao": dict1['data'][stock]['8'],
"chengjiaoe": dict1['data'][stock]['19'],
"huanshou": dict1['data'][stock]['1968584'],
"zuidi": dict1['data'][stock]['9'],
"zuoshou": dict1['data'][stock]['6'],
"liutongshizhi": dict1['data'][stock]['3475914']
}
cursor.execute(sql_insert, insert_data)
conn.commit()
print(stock, ':写入完成')
except:
print('写入异常')
# 遇到错误继续循环
continue
def main():
stock_list_url = 'https://hq.gucheng.com/gpdmylb.html'
stock_info_url = 'http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code='
list = get_stock_list(stock_list_url)
# list = ['601766']
getStockInfo(list, stock_info_url)
if __name__ == '__main__':
main()
成就
最终,编辑器用了15分钟左右,成功捕获了4600+条数据,结果就不显示了。
示例代码
为了您的方便,本系列中的所有代码编辑器都将放在代码管理存储库 Github 和 Gitee 上。
示例代码 - Github
示例代码 - Gitee