盘锦威旺做网站,开发公司土地使用税什么时候开始交,商业广告创意设计,手机怎么浏览国外网站一、爬虫基础流程
爬虫的过程模块化#xff0c;基本上可以归纳为以下几个步骤#xff1a;
1、分析网页URL#xff1a;打开你想要爬取数据的网站#xff0c;然后寻找真实的页面数据URL地址#xff1b;
2、请求网页数据#xff1a;模拟请求网页数据#xff0c;这里我们介…一、爬虫基础流程
爬虫的过程模块化基本上可以归纳为以下几个步骤
1、分析网页URL打开你想要爬取数据的网站然后寻找真实的页面数据URL地址
2、请求网页数据模拟请求网页数据这里我们介绍requests库的使用
3、解析网页数据根据请求获得的网页数据我们用不同的方式解析成我们需要用的数据如果网页数据为html源码我们用Beautiful Soup、xpath和re正则表达式三种解析若网页数据为json格式我们可以直接用字典列表等基础知识处理
4、存储网页数据一般来说解析后的数据是比较结构化的可以保存为txt、csv、json或excel等文本亦或者可以存储在数据库如MySql、MongoDB或SqlLite中。二、分析网页URL
当我们有一个目标网站有时候会发现对于静态网页我们只需要把网页地址栏中的URL传到get请求中就可以直接取到网页的数据。但如果这是动态网页我们便无法通过简单的传递网页地址栏的URL给get请求来获取网页数据往往这个时候我们进行翻页的时候还会发现网页地址栏中的URL是不会发生变化的。接下来我们来分别介绍这两种情况下如何获取真实的页面数据URL地址。
1、静态网页
对于静态网页来说其实网页地址栏中的URL就是我们需要的。
以贝壳二手房网(https://cd.ke.com/ershoufang/) 为例我们可以看到进行翻页(如到第2页)的时候网页地址栏的URL变为了(https://cd.ke.com/ershoufang/pg2/)。类型这种情况多半就是静态网页了而且翻页的URL规律十分明显。
如下图所示2、 动态网页
对于动态网页来说我们一般可以通过以下几个步骤找到真实URL地址
需要按“F12”进入到浏览器的开发者模式
点击“Network”—XHR或JS或者你全部查找看
进行翻页(可能是点击下一页或者下滑加载更多)
观察第2步中name模块的内容变化寻找。
以虎牙星秀区(https://www.huya.com/g/xingxiu) 为例我们可以看到进行翻页(如到第2页)的时候网页地址栏的URL没有发生任何改变。
为了便于找到真实的URL地址我们可以在开发者模式中找以下截图中的几点preview是预览结果可以便于我们进行匹配定位具体的Name。当我们定位到具体的Name后右侧选择Headers可以查看到请求网页需要的相关参数信息而且比较好拟清其变化规律。以虎牙星秀为例其真实URL地址及变化规律如下以某博为例(https://weibo.com/newlogin?tabtypeweibogid102803openLoginLayer0urlhttps%3A%2F%2Fwww.weibo.com%2F) 为例我们可以看到一直往下拖拉时候网页地址栏的URL没有发生任何改变。这是我们需要按“F12”进入到浏览器的开发者模式一边往下拖拉一边查看network里面内容的变化三、请求网页数据
当我们确定了真实数据的URL后这里便可以用requests的get或post方法进行请求网页数据。关于requests库的更多使用方式大家可以前往(https://requests.readthedocs.io/zh_CN/latest/ 或 https://www.cnblogs.com/aaronthon/p/9332757.html)查看。
1、发送get请求
1对于静态网页 我们得到的是一个Response对象如果我们想要获取网页数据可以使用text或content属性来获取另外如果获取的网页数据是json格式的则可以使用Requests 中内置的 **json()**解码器方法助你处理json 数据。r.text字符串类型的数据一般网页数据为文本类用此属性
r.content二进制类型的数据一般网页数据为视频或者图片时用此属性
r.json()json数据解码一般网页数据为json格式时用此方法2对于动态网页
对于一些动态网页请求的网址是基础url和关键字参数组合而成这个时候我们可以使用 params 关键字参数以一个字符串字典来提供这些参数。如下
import requests
url https://www.huya.com/cache.php
parames {m: LiveList,do: getLiveListByPage,gameId: 1663,tagAll: 0,page: 2, # 翻页变化的就是这个参数}
r requests.get(url, paramsparames)
print(r.url) # https://www.huya.com/cache.php?mLiveListdogetLiveListByPagegameId1663tagAll0page22、发送post请求
通常你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:payload {key1: value1, key2: value2}r requests.post(http://httpbin.org/post, datapayload)
很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string 而不是一个 dict那么数据会被直接发布出去。 import jsonurl https://api.github.com/some/endpointpayload {some: data}r requests.post(url, datajson.dumps(payload))此处除了可以自行对 dict 进行编码你还可以使用 json 参数直接传递然后它就会被自动编码。url https://api.github.com/some/endpointpayload {some: data}r requests.post(url, jsonpayload)3、定制请求头
在模拟请求时如果不设置请求头的话是比较容易被网站发现是来自爬虫脚本一些网站会对这种模拟请求进行拒绝。因此我们可以简单设置一下请求头做伪装一般是设置浏览器。headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36,}
r requests.get(url, headersheaders)
其实对于请求头还可以设置很多参数具体大家可以在实际爬虫过程中在开发者模式看看里面的请求头模块进行分析处理。4、响应码
我们在 2.1 中看到获取响应码的是通过 r.status_code属性一般来说如果 返回 数字 200则表示成功获取了网页数据。
响应码分为五种类型由它们的第一位数字表示1xx信息请求收到继续处理 2xx成功行为被成功地接受、理解和采纳 3xx重定向为了完成请求必须进一步执行的动作 4xx客户端错误请求包含语法错误或者请求无法实现 5xx服务器错误服务器不能实现一种明显无效的请求四、解析数据
上面有提到我们请求的网页数据有Html源码文本或者是json字符串文本两者的解析方式不同。以下我们分别进行简单说明大家在实际操作中视情况而定即可。
1、网页html文本解析
对于网页html文本来说这里介绍Beautiful Soup、xpath和re正则表达式三种解析方法。
以贝壳二手房最新房源(https://cd.ke.com/ershoufang/co32/)为例其html源码如下我们通过get请求后的数据进行解析。1Beautiful Soup
from bs4 import BeautifulSoup
html_doc
htmlheadtitleThe Dormouses story/title/head
body
p classtitlebThe Dormouses story/b/p
p classstoryOnce upon a time there were three little sisters; and their names were
a hrefhttp://example.com/elsie classsister idlink1Elsie/a,
a hrefhttp://example.com/lacie classsister idlink2Lacie/a and
a hrefhttp://example.com/tillie classsister idlink3Tillie/a;
and they lived at the bottom of a well./p
p classstory.../p# 创建一个 soup 对象
soup BeautifulSoup(html_doc, lxml)
print(soup, type(soup)) # class bs4.BeautifulSoup
# 格式化文档输出
print(soup.prettify())
# 获取 title 标签的名称 title
print(soup.title.name) # title
# 获取 title 标签内容
print(soup.title) # titleThe Dormouses story/title
# title 标签里面的文本内容
print(soup.title.string)
# 获取 p 段落
print(soup.p)Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。
关于Beautiful Soup库的更多使用方式大家可以前往查看(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)
首先安装pip install beautifulsoup4。
我们将网页html文本内容r.text当作第一个参数传给BeautifulSoup对象该对象的第二个参数为解析器的类型这里使用lxml此时就完成了BeaufulSoup对象的初始化。然后将这个对象赋值给soup变量。如下所示from bs4 import BeautifulSoup
import requests
url https://cd.ke.com/ershoufang/pg1/
r requests.get(url)
soup BeautifulSoup(r.text, lxml)解析来分析网页寻找节点
发现所有数据都在classsellListContent节点下因此对它下面的数据进行提取
# 获取全部房源 所在的节点
sellList soup.find(class_sellListContent)
# 获取全部房源节点列表
lis sellList.find_all(li,class_clear)
# 选取第一个房源节点
div lis[0].find(div,class_info clear)
# 采集房源名称
title div.find(div,class_title)
print(title.text)房源其他信息大家可以自己处理
2xpath
XPath全称 XML Path Language即 XML 路径语言它是一门在 XML 文档中查找信息的语言。
首先导入 lxml 库的 etree 模块然后声明一段 HTML 文本调用 HTML 类进行初始化成功构造一个 XPath 解析对象。
from lxml import etree
import requests
url https://cd.ke.com/ershoufang/pg1/
r requests.get(url)
html etree.HTML(r.text)# 通过copy获取的xpath//*[idbeike]/div[1]/div[4]/div[1]/div[4]/ul/li[1]/div/div[1]/a
# 获取 全部房源所在节点 ul根据属性匹配精准查找
ul html.xpath(.//ul[classsellListContent])[0]
# 获取房源列表
lis ul.xpath(.//li[classclear])
# 选取第一个房源节点
li lis[0]
# 获取其房源名称
li.xpath(./div/div[1]/a/text())其他房源信息大家可以自行处理
3re正则
关于re正则解析网页html大家也可以前往查看https://blog.csdn.net/wtt234/article/details/128360395进行学习。
2、json文本解析
在requests提供了r.json()可以用于json数据解码一般网页数据为json格式时用此方法。除此之外还可以通过json.loads()和eval()方法进行处理。
url https://www.huya.com/cache.php
parames {m: LiveList,do: getLiveListByPage,gameId: 1663,tagAll: 0,page: 2, # 翻页变化的就是这个参数}
r requests.get(url, paramsparames)
data r.json()
print(data)五、存储数据
当我们获取了到想要的数据后便可以写入本地了。 对于文本类数据可以通过csv模块或pandas模块进行写入到本地csv文件或excel文件同时也可以用pymysql模块写入到数据库或者sqlite写入到本地数据库。 对于视频或者图片可以open一个文件然后写入二进制内容后保存本地亦可。 关于存储数据大家可以结合实际案例进行学习。
六、爬取、清洗并保存上面几个网站的数据完整代码带有解释
1、谋壳二手房数据
正则提取数据保存在csv、xlsx与mysql里面
# coding:utf-8
import re,requests,time
import pandas as pd
import mysql.connectorclass RenrenLogin(object):def __init__(self):# 设置存储数据文件路径self.csvlj rC:\Users\xxx\xxx\bk1.csvself.excellj rC:\Users\xxx\xxx\bk2.xlsxdef get_html(self,url):# 由于获取的html最后是text(文本)形式因此直接去掉文本里面的空格、换行符和回车符html requests.get(urlurl).text.replace(\n, ).replace(\r, ).replace( ,)return htmldef parse_html(self, html):# 房源名称title re.findall(raclassVIEWDATACLICKDATAmaidian-detailtitle(.*?), html, re.S)# 房源链接href re.findall(raclassVIEWDATACLICKDATAmaidian-detailtitle.*?data-hreftype.*?data-agentid.*?data-maidian.*?href(.*?),html, re.S)# 房源信息houseinfo re.findall(rspanclasshouseIcon/span(.*?)/divdivclassfollowInfo,html,re.S)# 关注量与发布天数starIcon re.findall(rspanclassstarIcon/span(.*?)/divdivclasstag,html,re.S)# 房源总价格houseprice re.findall(rdivclasstotalPricetotalPrice2i/ispanclass(.*?)/spani万/i/div,html,re.S)# 房源单价unitPrice re.findall(rdivclassunitPricedata-hid.*?data-pricespan(.*?)/span/div, html, re.S)# 房源其它优势housetag re.findall(rdivclasstag(.*?)/span/divdivclasspriceInfo, html, re.S)self.parse_mysql(title, href, houseinfo, starIcon, houseprice, unitPrice, housetag)return title, href, houseinfo, starIcon, houseprice, unitPrice, housetagdef parse_csv_excel(self,title,href,houseinfo,starIcon,houseprice,unitPrice,housetag):# 创建一个字典来表示数据data {itle: title,href: href,houseinfo: houseinfo,starIcon:starIcon,houseprice:houseprice,unitPrice: unitPrice,housetag:housetag}# 使用字典创建DataFramedf pd.DataFrame(data)# 保存到csv文件里面df.to_csv(self.csvlj, indexFalse)# 保存到excel文件里面df.to_excel(self.excellj, indexFalse)def parse_mysql(self,title,href,houseinfo,starIcon,houseprice,unitPrice,housetag):# 连接到 MySQL 数据库conn mysql.connector.connect(hostlocalhost,userroot,password123456,databasebeike)# 创建游标对象cursor conn.cursor()# 创建表cursor.execute(CREATE TABLE IF NOT EXISTS bk (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(500) NOT NULL,href VARCHAR(500) NOT NULL,houseinfo VARCHAR(500) NOT NULL,starIcon VARCHAR(500) NOT NULL,houseprice VARCHAR(500) NOT NULL,unitPrice VARCHAR(500) NOT NULL,housetag VARCHAR(1000) NOT NULL))# 执行插入数据操作for i in range(len(title)):sql_select insert into bk (title,href,houseinfo,starIcon,houseprice,unitPrice,housetag) values \({},{},{},{},{},{},{}).format(title[i],href[i],houseinfo[i],starIcon[i],houseprice[i],unitPrice[i],housetag[i])try:cursor.execute(sql_select)except Exception as e:print(e)conn.rollback()conn.commit()cursor.close()conn.close()def main(self,):title, href, houseinfo, starIcon, houseprice, unitPrice, housetag [],[],[],[],[],[],[]for i in range(1, 3): # 爬取前20页的数据构建不同的页数urlurl https://cd.ke.com/ershoufang/pg{}/.format(i)spider1 self.get_html(url)spider2 self.parse_html(spider1)title title spider2[0]href href spider2[1]houseinfo houseinfo spider2[2]starIcon starIcon spider2[3]houseprice houseprice spider2[4]unitPrice unitPrice spider2[5]housetag housetag spider2[6]print(f第{i}页爬取结束)time.sleep(10)self.parse_csv_excel(title, href, houseinfo, starIcon, houseprice, unitPrice, housetag)if __name__ __main__:spider RenrenLogin()spider.main()结果如下
2、某博数据的热门话题
# coding:utf-8
import requests,time,os,openpyxl
from openpyxl import Workbook,load_workbookclass RenrenLogin(object):def __init__(self):# 设置存储数据文件路径self.csvlj rC:\Users\xxx\xxx\wb.csvself.excellj rC:\Users\xxx\xxx\wb.xlsx# 设置请求头self.headers {Accept: XXXXX,Accept-Encoding: XXXXX,Accept-Language: XXXXX,Client-Version: XXXXX,Cookie: XXXXXXXXXXXXXXXXX,User-Agent: XXXXXXXXXXXXXXXXX}def get_html(self, url):# 因此f12查看时数据为json格式data1 requests.get(urlurl, headersself.headers).json()return data1def parse_html(self, data1):for i in range(len(data1[statuses])):alldata []alldata.append(data1[statuses][i][user][screen_name]) # User_title(发布用户的title)alldata.append(data1[statuses][i][source]) # Info_Source(发布来源)alldata.append(data1[statuses][i][text_raw]) # 发布内容alldata.append(data1[statuses][i][attitudes_count]) # 点赞数量alldata.append(data1[statuses][i][comments_count]) # 评论数量alldata.append(data1[statuses][i][reposts_count]) # 转发数量self.parse_excel(alldata)return Truedef parse_excel(self, alldata):if not os.path.exists(self.excellj):workbook Workbook()workbook.save(self.excellj)wb openpyxl.load_workbook(self.excellj)wa wb.activewa.append([User_title, Info_Source, text_raw, attitudes_count, comments_count, reposts_count])wa.append(alldata)wb.save(self.excellj)else:wb openpyxl.load_workbook(self.excellj)wa wb.activewa.append(alldata)wb.save(self.excellj)return Truedef main(self, ):for i in range(3): # 爬取前3页的数据构建不同的页数urlurl https://weibo.com/ajax/feed/hottimeline?refresh2group_id102803containerid102803extparamdiscover%7Cnew_feedmax_id{}count10.format(i)spider1 self.get_html(url)spider2 self.parse_html(spider1)print(f第{i1}页爬取结束)time.sleep(10)if __name__ __main__:spider RenrenLogin()spider.main()3、某红薯书数据爬取
# coding:utf-8
import requests,time,os,openpyxl
from openpyxl import Workbook,load_workbookclass RenrenLogin(object):def __init__(self):# 设置存储数据文件路径self.excellj rC:\XXXXXXXXXXXXX\xhs.xlsxself.headers {Cookie: XXXXXXXXXXXXX,User-Agent: XXXXXXXXXXXXX,X-S: XXXXXXXXXXXXX}def get_html(self, url):data1 requests.get(urlurl, headersself.headers).json()self.parse_html(data1)def parse_html(self, data1):for i in range(len(data1[data][comments])):alldata []alldata.append(data1[data][comments][i][user_info][nickname])alldata.append(data1[data][comments][i][content])alldata.append(data1[data][comments][i][sub_comment_cursor])alldata.append(data1[data][comments][i][sub_comment_count])alldata.append(str(data1[data][comments][i][sub_comments]))alldata.append(data1[data][comments][i][like_count])alldata.append(data1[data][comments][i][user_info][image])print(alldata)self.parse_excel(alldata)return Truedef parse_excel(self, alldata):if not os.path.exists(self.excellj):workbook Workbook()workbook.save(self.excellj)wb openpyxl.load_workbook(self.excellj)wa wb.activewa.append([nickname, content, sub_comment_cursor, sub_comment_count, sub_comments, like_count ,image])wa.append(alldata)wb.save(self.excellj)else:wb openpyxl.load_workbook(self.excellj)wa wb.activewa.append(alldata)wb.save(self.excellj)return Truedef main(self, ):note_id XXXXXXXXXXXXX# 一级评论cursorcursor [,XXXXXXXXXXXXX,XXXXXXXXXXXXX,XXXXXXXXXXXXX,XXXXXXXXXXXXX,XXXXXXXXXXXXX]for i in range(len(cursor)):if i 0:url fhttps://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id{note_id}cursortop_comment_idimage_formatsjpg,webp,avifelse:url fhttps://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id{note_id}cursor{cursor[i]}top_comment_idimage_formatsjpg,webp,avifself.get_html(url)print(f第{i1}页爬取结束)time.sleep(10)if __name__ __main__:spider RenrenLogin()spider.main() 文章转载自: http://www.morning.ktfnj.cn.gov.cn.ktfnj.cn http://www.morning.tsqpd.cn.gov.cn.tsqpd.cn http://www.morning.drcnf.cn.gov.cn.drcnf.cn http://www.morning.pnjsl.cn.gov.cn.pnjsl.cn http://www.morning.mllmm.cn.gov.cn.mllmm.cn http://www.morning.enjoinfo.cn.gov.cn.enjoinfo.cn http://www.morning.stmkm.cn.gov.cn.stmkm.cn http://www.morning.dygsz.cn.gov.cn.dygsz.cn http://www.morning.tsxg.cn.gov.cn.tsxg.cn http://www.morning.qzpqp.cn.gov.cn.qzpqp.cn http://www.morning.yongkangyiyuan-pfk.com.gov.cn.yongkangyiyuan-pfk.com http://www.morning.bscsp.cn.gov.cn.bscsp.cn http://www.morning.fbrshjf.com.gov.cn.fbrshjf.com http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.tkcz.cn.gov.cn.tkcz.cn http://www.morning.kndt.cn.gov.cn.kndt.cn http://www.morning.zrqs.cn.gov.cn.zrqs.cn http://www.morning.aswev.com.gov.cn.aswev.com http://www.morning.ryxyz.cn.gov.cn.ryxyz.cn http://www.morning.ssqrd.cn.gov.cn.ssqrd.cn http://www.morning.bjjrtcsl.com.gov.cn.bjjrtcsl.com http://www.morning.lmhwm.cn.gov.cn.lmhwm.cn http://www.morning.wmglg.cn.gov.cn.wmglg.cn http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.dybth.cn.gov.cn.dybth.cn http://www.morning.qyrnp.cn.gov.cn.qyrnp.cn http://www.morning.brps.cn.gov.cn.brps.cn http://www.morning.jbfjp.cn.gov.cn.jbfjp.cn http://www.morning.kgcss.cn.gov.cn.kgcss.cn http://www.morning.nzcys.cn.gov.cn.nzcys.cn http://www.morning.sdamsm.com.gov.cn.sdamsm.com http://www.morning.srndk.cn.gov.cn.srndk.cn http://www.morning.ishoufeipin.cn.gov.cn.ishoufeipin.cn http://www.morning.dlbpn.cn.gov.cn.dlbpn.cn http://www.morning.dglszn.com.gov.cn.dglszn.com http://www.morning.qcdhg.cn.gov.cn.qcdhg.cn http://www.morning.jnrry.cn.gov.cn.jnrry.cn http://www.morning.nykzl.cn.gov.cn.nykzl.cn http://www.morning.fblkr.cn.gov.cn.fblkr.cn http://www.morning.tmcmj.cn.gov.cn.tmcmj.cn http://www.morning.dhxnr.cn.gov.cn.dhxnr.cn http://www.morning.myfwb.cn.gov.cn.myfwb.cn http://www.morning.jqzns.cn.gov.cn.jqzns.cn http://www.morning.lgmty.cn.gov.cn.lgmty.cn http://www.morning.hlppp.cn.gov.cn.hlppp.cn http://www.morning.yrjhr.cn.gov.cn.yrjhr.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.dxqwm.cn.gov.cn.dxqwm.cn http://www.morning.wzwyz.cn.gov.cn.wzwyz.cn http://www.morning.zffn.cn.gov.cn.zffn.cn http://www.morning.zcnfm.cn.gov.cn.zcnfm.cn http://www.morning.easiuse.com.gov.cn.easiuse.com http://www.morning.hcxhz.cn.gov.cn.hcxhz.cn http://www.morning.ttshf.cn.gov.cn.ttshf.cn http://www.morning.dfhkh.cn.gov.cn.dfhkh.cn http://www.morning.xtqld.cn.gov.cn.xtqld.cn http://www.morning.glpxx.cn.gov.cn.glpxx.cn http://www.morning.bnkcl.cn.gov.cn.bnkcl.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.jxlnr.cn.gov.cn.jxlnr.cn http://www.morning.pnmnl.cn.gov.cn.pnmnl.cn http://www.morning.rhsr.cn.gov.cn.rhsr.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.qytby.cn.gov.cn.qytby.cn http://www.morning.srkwf.cn.gov.cn.srkwf.cn http://www.morning.hqpyt.cn.gov.cn.hqpyt.cn http://www.morning.ydmml.cn.gov.cn.ydmml.cn http://www.morning.lhldx.cn.gov.cn.lhldx.cn http://www.morning.rqfkh.cn.gov.cn.rqfkh.cn http://www.morning.kqxng.cn.gov.cn.kqxng.cn http://www.morning.nppml.cn.gov.cn.nppml.cn http://www.morning.rsjf.cn.gov.cn.rsjf.cn http://www.morning.yfcbf.cn.gov.cn.yfcbf.cn http://www.morning.thjqk.cn.gov.cn.thjqk.cn http://www.morning.hcbky.cn.gov.cn.hcbky.cn http://www.morning.hous-e.com.gov.cn.hous-e.com http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn http://www.morning.webpapua.com.gov.cn.webpapua.com http://www.morning.zwtp.cn.gov.cn.zwtp.cn