解决方案:轩软SEO优化推广机器
优采云 发布时间: 2022-12-07 17:38解决方案:轩软SEO优化推广机器
轩软SEO优化推广机是一款非常棒的软件。软件集成了上万条ip查询、Alexa排名查询、pr查询等站长常用查询网站。它易于安装且使用起来非常方便。快来QT软件园下载吧。
介绍
轩软SEO优化推广机集成了上万条ip查询、Alexa排名查询、pr查询等常用查询网站,因为这些网站大部分都有查询记录显示功能,查询记录可以查看百度、谷歌、搜狗、搜搜等,雅虎搜索引擎速度快收录,从而形成外链。因为这是正常查询生成的外链,这种外链可以显着增加收录,提高搜索引擎排名;批量提交后到查询网站查询你的网站数据库留下你的地址。查询网权重很高,蜘蛛经常访问,吸引蜘蛛爬到你的网站,更好的提高排名!我们的优势:全部免费,
解决方案:1 爬虫入门 requests模块 UA伪装
爬虫1 爬虫简介 1.1 什么是爬虫
爬虫是通过编写程序模拟浏览器上网,然后从网页中抓取数据的过程。
1.2 分类 1.2.1 通用爬虫和聚焦爬虫
Universal Crawler:爬取一个网页的所有源代码。
聚焦爬虫:爬取网页中的部分内容。
Focused Crawler 建立在 Universal Crawler 之上。
1.2.2 增量爬虫和分布式爬虫
增量爬虫在上次爬取的基础上继续爬取数据,适用于继续爬取由于某种原因未爬取的数据或网站更新的数据;
分布式爬虫就是将爬虫程序部署在多台服务器上,是一种提高爬虫效率的方法。
1.3 反爬机制和反爬策略
防爬机构
网站应用反爬虫机制,防止爬虫爬取网站数据。
反爬策略
反爬策略应用于爬虫,用于**网站的反爬机制,对网站中的数据进行爬取。
1.4 请求模块
requests模块是一个基于网络请求的模块,可以用来模拟浏览器浏览过程。
过程:
指定网址;发起请求;获取响应数据;持久存储数据。1.5 Chrome开发者工具中Elements和Network的区别2案例搜狗搜索首页 2.1 抓取搜狗首页页面源码
import requests
# 指定url
target_url = 'https://www.sogou.com/'
# 发起请求,获取响应对象
response_obj = requests.get(url=target_url) # 请求方式为get
# 获取响应数据
page_text = response_obj.text # 以字符串的形式获取响应数据
# 持久化存储数据
with open('./sogou.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
2.2 简单网页采集器
基于搜狗搜索抓取任意搜索关键词的页面源码。
重点:
避免乱码UA伪装
keyword = input('Please enter a keyword:')
target_url = 'https://www.sogou.com/web'
params = {
'query': keyword
}
# 进行UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
response_obj = requests.get(url=target_url, headers=headers, params=params)
# 设置响应数据的编码格式,避免乱码。
response_obj.encoding = 'utf-8'
page_text = response_obj.text
filename = '{keyword}.html'.format(keyword=keyword)
with open(filename, 'w', encoding='utf-8') as fp:
fp.write(page_text)
2.3 反爬策略一:UA伪装
异常访问请求
非浏览器向网站发起的请求称为异常访问请求。
用户代理
User agent,简称UA,是一个特殊的字符串头,表示请求载体的身份。
服务器可以通过UA识别用户使用的操作系统及版本、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
防爬机构
一些网站会获取并判断请求头中的User-Agent来访问网站,如果通过UA识别请求者为爬虫,网站将拒绝提供数据。
反爬策略:
将爬虫发起的请求中的UA伪装成某个浏览器的身份。
通用用户代理
Safari:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50
Chrome
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Firefox
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0
3 案例爬取动态加载数据
动态加载数据
另一个新请求获取的数据称为动态加载数据。
向浏览器地址栏中的当前页面url发送请求无法获取动态加载数据。
3.1 豆瓣电影
豆瓣电影精选电影
目标:抓取热门电影页面上显示的电影名称和评分。
判断目标数据是否属于动态加载的数据
在Chrome选项卡Network中,找到当前地址栏中url对应的数据包,在其内部选项卡Response中部分检索某个页面显示的电影名称,例如,我想哭,我戴着猫*敏*感*词*。如果没有检索到,说明当前url对应的数据包中没有电影数据,页面显示的电影数据属于动态加载的数据。
捕获动态加载数据
全局搜索:点击左侧某个包,使用快捷键Ctrl+F搜索所有数据包,找到收录数据的包。
搜索结果响应
{"subjects":[{"rate":"6.5","cover_x":4800,"title":"想哭的我戴上了猫的*敏*感*词*"...
可以知道返回的响应数据是一个Json格式的字符串。
查看请求信息 Headers
Request URL: https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
Request Method: GET
查询字符串参数
type: movie
tag: 热门
sort: recommend
page_limit: 20
page_start: 0
按照这个方法查看其他影片,可以发现通过修改参数page_limit和page_start,可以指定当前页面显示的页数和起始位置,例如:从第5条开始获取3条数据。
target_url = 'https://movie.douban.com/j/search_subjects'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
params = {
'type': 'movie',
'tag': '热门',
'sort': 'recommend',
'page_limit': '3',
'page_start': '5',
}
response_obj = requests.get(url=target_url, headers=headers, params=params)
response_dict = response_obj.json()
film_list = response_dict['subjects']
for each_file_dict in film_list:
title = each_file_dict['title']
rate = each_file_dict['rate']
print(title, rate)
'''
咱们裸熊:电影版 7.6
午夜0时的吻 5.3
翻译疑云 7.2
'''
3.2 肯德基餐厅信息
目标:爬取北京肯德基餐厅的位置信息。
肯德基餐厅信息查询:
判断目标数据是否属于动态加载数据捕获动态加载数据
数据包的响应数据
{"Table":[{"rowcount":440}],"Table1":[{"rownum":1,"storeName":"前门","addressDetail":"西城区前门西大街正阳市场1号楼中部","pro":"Wi-Fi,礼品卡","provinceName":"北京市","cityName":"北京市"}...
查看请求信息 Headers
Request URL: http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
Request Method: POST
表单数据
cname: 北京
pid:
pageIndex: 1
pageSize: 10
target_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
pageIndex = 1
<p>
while True:
data = {
'cname': '北京',
'pid': '',
'pageIndex': str(pageIndex),
'pageSize': '10'
}
response_dict = requests.post(url=target_url, headers=headers, data=data).json()
restaurant_list = response_dict['Table1']
if len(restaurant_list) == 0:
break
for each_restaurant_dict in restaurant_list:
each_restaurant_name = each_restaurant_dict['storeName']
each_restaurant_address = each_restaurant_dict['addressDetail']
print(each_restaurant_name, each_restaurant_address)
pageIndex += 1
</p>
3.3 化妆品生产许可信息
化妆品生产许可证信息管理系统服务平台::81/xk/
目标:获取企业名称、营业地址和生产地址。
随便开一张化妆品生产许可证信息
:81/xk/itownet/portal/dzpz.jsp?id=ff83aff95c5541cdab5ca6e847514f88
包装信息
标头
Request URL: http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
Request Method: POST
表单数据
id: ff83aff95c5541cdab5ca6e847514f88
回复
{"businessLicenseNumber":"91440101MA5CYUF0XX",...
回到首页,全局获取Form Data中的id
标头
Request URL: http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList
Request Method: POST
表单数据
on: true
page: 1
pageSize: 15
productName:
conditionType: 1
applyname:
applysn:
回复
{"filesize":"","keyword":"","list":[{"ID":"ff83aff95c5541cdab5ca6e847514f88","EPS_NAME":"广东天姿化妆品科技*敏*感*词*",...
main_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
id_list = []
for page in range(1, 6):
data = {
'on': 'true',
'page': str(page),
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn': '',
}
data_list = requests.post(url=main_url, headers=headers, data=data).json()['list']
for each_dict in data_list:
id_list.append(each_dict['ID'])
detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
for each_id in id_list:
data = {
"id": each_id
}
detail_dict = requests.post(url=detail_url, headers=headers, data=data).json()
print(detail_dict['epsName'], detail_dict['epsAddress'], detail_dict['epsProductAddress'])
3.4 荣誉线下门店信息
荣誉线下门店:
目的:获取并保存荣耀北京线下门店信息。
店铺详情页面:
标头
Request URL: https://openapi.vmall.com/mcp/offlineshop/getShopById?portal=2&version=10&country=CN&shopId=107527&lang=zh-CN
Request Method: GET
查询字符串参数
portal: 2
version: 10
country: CN
shopId: 107527
lang: zh-CN
回复
{"code":"0","shopInfo":{"address":"北京市顺义区新顺南大街4号鑫海韵通家电商城大卖场一层荣耀体验店","brand":1,"city":"北京市","dist":"顺义区","distance":0.0,"id":107527,"isStar":1,"latitude":"40.135089","longitude":"116.65831","name":"荣耀授权体验店(鑫海韵通电器商城店)","pictures":[],"province":"北京市","score":5,"serviceTime":"9:00-19:30","shopCode":"RYRA01000722","starShopPic":"https://res.vmallres.com/pimages//offlineshop/FOMuBZyeqTWYYJgMLPP2.jpg","type":1},"success":true}
回到首页全局搜索shopId:107527
标头
Request URL: https://openapi.vmall.com/mcp/offlineshop/getShopList
Request Method: POST
表单数据
{"portal":2,"lang":"zh-CN","country":"CN","brand":1,"province":"北京","city":"北京","pageNo":1,"pageSize":20}:
注意:此时Form Data的数据格式为Json格式。
回复
{"code":"0","shopInfos":[{"address":"北京市顺义区新顺南大街4号鑫海韵通家电商城大卖场一层荣耀体验店","brand":1,"city":"北京市",...
import requests
import json
main_url = 'https://openapi.vmall.com/mcp/offlineshop/getShopList'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
}
pageNo = 0
shop_id_list = []
while True:
data_dict = {
'portal': '2',
'lang': 'zh-CN',
'country': 'CN',
'brand': '1',
'province': '北京',
'city': '北京',
'pageNo': str(pageNo),
'pageSize': '20',
}
data_json = json.dumps(data_dict) # Form Data传入的数据转化为Json格式。
response_dict = requests.post(url=main_url, headers=headers, data=data_json).json()
shop_list = response_dict['shopInfos']
if len(shop_list) == 0:
break
for each_shop in shop_list:
shop_id_list.append(each_shop['id'])
pageNo += 1
shop_detail_list = []
detail_url = 'https://openapi.vmall.com/mcp/offlineshop/getShopById'
for each_shop_id in shop_id_list:
data_dict = {
<p>
'portal': '2',
'version': '10',
'country': 'CN',
'shopId': each_shop_id,
'lang': 'zh-CN'
}
response_dict = requests.get(url=detail_url, headers=headers, params=data_dict).json()
shopInfo_dict = response_dict['shopInfo']
name_str = shopInfo_dict['name']
address_str = shopInfo_dict['address']
service_time_str = shopInfo_dict['serviceTime']
shop_detail_list.append('name: {name_str}, address: {address_str}, service time: {service_time_str}\n'.format(name_str=name_str, address_str=address_str, service_time_str=service_time_str))
with open('./AllShopInfo.txt', 'w', encoding='utf-8') as fp:
fp.writelines(shop_detail_list)
</p>
4 抓取图片 4.1 抓取图片操作
示例图片:
方法一:requests模块发送get请求
import requests
headers = {
'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
img_url = 'https://gss0.baidu.com/7LsWdDW5_xN3otqbppnN2DJv/forum/pic/item/95eef01f3a292df57080696eab315c6034a8730e.jpg'
img_name = img_url.split('/')[-1]
img_path = './{filename}'.format(filename=img_name)
response_obj = requests.get(url=img_url, headers=headers)
img_data = response_obj.content
with open(img_path, 'wb') as fp:
fp.write(img_data)
方法二:urllib模块
import urllib
img_url = 'https://gss0.baidu.com/7LsWdDW5_xN3otqbppnN2DJv/forum/pic/item/95eef01f3a292df57080696eab315c6034a8730e.jpg'
img_name = img_url.split('/')[-1]
img_path = './{filename}'.format(filename=img_name)
urllib.request.urlretrieve(url=img_url, filename=img_path)
与方法二(urllib模块)相比,方法一(requests模块)可以进行UA伪装。
4.2 尴尬案情百科图片
目标:批量抓取尴尬百科热图中的所有图片。
尴尬百科热图:
抓取第一页的图片
import requests
import os
import re
dir_name = './imgs'
if not os.path.exists(dir_name):
os.mkdir(dir_name)
headers = {
'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
target_url = 'https://www.qiushibaike.com/imgrank/'
response_obj = requests.get(url=target_url, headers=headers)
response_obj.encoding = 'utf-8'
page_text = response_obj.text
ex = '.*?'
# 注意回车问题,re.S可以让正则表达式匹配时忽略回车。
img_src_list = re.findall(ex,page_text, re.S)
for each_src in img_src_list:
full_src = 'https:{src}'.format(src=each_src)
img_data = requests.get(url=full_src, headers=headers).content
img_name = each_src.split('/')[-1]
img_path = '{dir_name}/{img_name}'.format(dir_name=dir_name, img_name=img_name)
with open(img_path, 'wb') as fp:
fp.write(img_data)
print(img_name,'爬取成功。')
第二页网址:
分析具有不同页码的 URL。具有不同页码的 URL 之间的区别仅在于 URL 后半部分的页码。
使用通用的 url 模板
https://www.qiushibaike.com/imgrank/page/%d/
import requests
import os
import re
dir_name = './imgs'
if not os.path.exists(dir_name):
os.mkdir(dir_name)
headers = {
'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
# target_url = 'https://www.qiushibaike.com/imgrank/'
url_model = 'https://www.qiushibaike.com/imgrank/page/%d/' # 通用url模板
for page_num in range(1, 10):
print('正在爬取第%d页的图片数据......' % page_num)
target_url = url_model % page_num
response_obj = requests.get(url=target_url, headers=headers)
response_obj.encoding = 'utf-8'
page_text = response_obj.text
ex = '.*?'
# 注意回车问题,re.S可以让正则表达式匹配时忽略回车。
img_src_list = re.findall(ex,page_text, re.S)
for each_src in img_src_list:
full_src = 'https:{src}'.format(src=each_src)
img_data = requests.get(url=full_src, headers=headers).content
img_name = each_src.split('/')[-1]
img_path = '{dir_name}/{img_name}'.format(dir_name=dir_name, img_name=img_name)
with open(img_path, 'wb') as fp:
fp.write(img_data)
print(img_name, '爬取成功。')
4.3 案例现场主素材高清图片
目标:批量抓取站长素材高清图片中的所有图片。
站长素材高清图片:
import re
import os
import requests
dir_name = './imgs'
if not os.path.exists(dir_name):
os.mkdir(dir_name)
headers = {
'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
target_url = 'http://sc.chinaz.com/tupian/'
response_obj = requests.get(url=target_url, headers=headers)
response_obj.encoding = 'utf-8'
response_text = response_obj.text
ex = r''
img_src_list = re.findall(ex, response_text, re.S)
url_root = 'http://pic2.sc.chinaz.com/files/pic/pic9/202006'
for each_img_src in img_src_list:
img_name_s = each_img_src.split('/')[-1]
img_name_list = img_name_s.split('_s')
img_name = img_name_list[0] + img_name_list[1]
img_url = '{url_root}/{img_name}'.format(url_root=url_root, img_name=img_name)
img_data = requests.get(url=img_url, headers=headers).content
img_path = '{dir_name}/{img_name}'.format(dir_name=dir_name, img_name=img_name)
with open(img_path, 'wb') as fp:
fp.write(img_data)
print(img_name, '爬取成功。')