网页视频抓取工具 知乎(Python开发爬虫常用的工具总结及网页抓取思路数据是否可以直接从HTML中获取?)
优采云 发布时间: 2021-11-20 23:10网页视频抓取工具 知乎(Python开发爬虫常用的工具总结及网页抓取思路数据是否可以直接从HTML中获取?)
使用Python开发爬虫是一件非常轻松愉快的事情,因为相关的库很多,而且使用起来很方便,十几行代码就可以完成一个爬虫的开发;
但是在对付网站有防爬措施,网站有js动态加载,App采集,就得动脑筋了;而在分布式爬虫的开发中,高性能爬虫的时候就得精心设计。
Python开发爬虫reqeusts常用工具汇总:Python HTTP网络请求库;pyquery:Python HTML DOM结构分析库,使用类似JQuery的语法;BeautifulSoup:python HTML 和 XML 结构分析;selenium:Python自动化测试框架,可用于爬虫;Phantomjs:无头浏览器,可以配合selenium获取js动态加载的内容;re: python 内置正则表达式模块;fiddler:抓包工具,原理是一个可以抓手机包的代理服务器;anyproxy:代理服务器,可以自己编写规则来拦截请求或响应,一般用在客户端采集;celery:Python分布式计算框架,可用于开发分布式爬虫;事件:基于协程的python网络库,可用于开发高性能爬虫grequests:asynchronous requestssaio http:异步http客户端/服务器框架asyncio:python内置异步io,事件循环库uvloop:一个非常快的事件循环库, with asyncio 极其高效的并发:Python 内置用于并发任务执行scrapy 的扩展:python 爬虫框架;Splash:一个JavaScript渲染服务,相当于一个轻量级浏览器,带有lua脚本,通过他的http API解析页面;Splinter:开源自动化Python Web 测试工具pyspider:Python 爬虫系统网页 爬取思路数据能否直接从HTML 中获取?数据直接嵌套在页面的HTML结构中;数据是使用JS动态渲染到页面中的吗?数据嵌套在js代码中,然后用js加载到页面或者用ajax渲染;获取的页面使用需要认证吗?登录后可以访问该页面;可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:然后用js加载到页面或者用ajax渲染;获取的页面使用需要认证吗?登录后可以访问该页面;可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:然后用js加载到页面或者用ajax渲染;获取的页面使用需要认证吗?登录后可以访问该页面;可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:
检查网站的cookie。在某些情况下,请求需要添加一个cookie来通过服务器上的一些验证;案例讲解静态页面解析(获取微信公众号文章)
import pyquery
import re
def weixin_article_html_parser(html):
"""
解析微信文章,返回包含文章主体的字典信息
:param html: 文章HTML源代码
:return:
"""
pq = pyquery.PyQuery(html)
article = {
"weixin_id": pq.find("#js_profile_qrcode "
".profile_inner .profile_meta").eq(0).find("span").text().strip(),
"weixin_name": pq.find("#js_profile_qrcode .profile_inner strong").text().strip(),
"account_desc": pq.find("#js_profile_qrcode .profile_inner "
".profile_meta").eq(1).find("span").text().strip(),
"article_title": pq.find("title").text().strip(),
"article_content": pq("#js_content").remove('script').text().replace(r"\r\n", ""),
"is_orig": 1 if pq("#copyright_logo").length > 0 else 0,
"article_source_url": pq("#js_sg_bar .meta_primary").attr('href') if pq(
"#js_sg_bar .meta_primary").length > 0 else '',
}
# 使用正则表达式匹配页面中js脚本中的内容
match = {
"msg_cdn_url": {"regexp": "(? a.W_texta").attr("title"))
return html
except (TimeoutException, Exception) as e:
print(e)
finally:
driver.quit()
if __name__ == '__main__':
weibo_user_search(url="http://s.weibo.com/user/%s" % parse.quote("新闻"))
# 央视新闻
# 新浪新闻
# 新闻
# 新浪新闻客户端
# 中国新闻周刊
# 中国新闻网
# 每日经济新闻
# 澎湃新闻
# 网易新闻客户端
# 凤凰新闻客户端
# 皇马新闻
# 网络新闻联播
# CCTV5体育新闻
# 曼联新闻
# 搜狐新闻客户端
# 巴萨新闻
# 新闻日日睇
# 新垣结衣新闻社
# 看看新闻KNEWS
# 央视新闻评论
使用Python模拟登录获取cookies
有的网站比较痛苦,通常需要登录才能获取数据。下面是一个简单的例子:是不是用来登录网站,获取cookie,然后可以用于其他请求
但是,这里只有在没有验证码的情况下,如果要短信验证、图片验证、邮件验证,就得单独设计;
目标网站:,日期:2017-07-03,如果网站的结构发生变化,需要修改如下代码;
#!/usr/bin/env python3
# encoding: utf-8
from time import sleep
from pprint import pprint
from selenium.common.exceptions import TimeoutException, WebDriverException
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium import webdriver
def login_newrank():
"""登录新榜,获取他的cookie信息"""
desired_capabilities = DesiredCapabilities.CHROME.copy()
desired_capabilities["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/59.0.3071.104 Safari/537.36")
desired_capabilities["phantomjs.page.settings.loadImages"] = True
# 自定义头部
desired_capabilities["phantomjs.page.customHeaders.Upgrade-Insecure-Requests"] = 1
desired_capabilities["phantomjs.page.customHeaders.Cache-Control"] = "max-age=0"
desired_capabilities["phantomjs.page.customHeaders.Connection"] = "keep-alive"
# 填写自己的账户进行测试
user = {
"mobile": "user",
"password": "password"
}
print("login account: %s" % user["mobile"])
driver = webdriver.PhantomJS(executable_path="/usr/bin/phantomjs",
desired_capabilities=desired_capabilities,
service_log_path="ghostdriver.log", )
# 设置对象的超时时间
driver.implicitly_wait(1)
# 设置页面完全加载的超时时间,包括页面全部渲染,异步同步脚本都执行完成
driver.set_page_load_timeout(60)
# 设置异步脚本的超时时间
driver.set_script_timeout(60)
driver.maximize_window()
try:
driver.get(url="http://www.newrank.cn/public/login/login.html?back=http%3A//www.newrank.cn/")
driver.find_element_by_css_selector(".login-normal-tap:nth-of-type(2)").click()
sleep(0.2)
driver.find_element_by_id("account_input").send_keys(user["mobile"])
sleep(0.5)
driver.find_element_by_id("password_input").send_keys(user["password"])
sleep(0.5)
driver.find_element_by_id("pwd_confirm").click()
sleep(3)
cookies = {user["name"]: user["value"] for user in driver.get_cookies()}
pprint(cookies)
except TimeoutException as exc:
print(exc)
except WebDriverException as exc:
print(exc)
finally:
driver.quit()
if __name__ == '__main__':
login_newrank()
# login account: 15395100590
# {'CNZZDATA1253878005': '1487200824-1499071649-%7C1499071649',
# 'Hm_lpvt_a19fd7224d30e3c8a6558dcb38c4beed': '1499074715',
# 'Hm_lvt_a19fd7224d30e3c8a6558dcb38c4beed': '1499074685,1499074713',
# 'UM_distinctid': '15d07d0d4dd82b-054b56417-9383666-c0000-15d07d0d4deace',
# 'name': '15395100590',
# 'rmbuser': 'true',
# 'token': 'A7437A03346B47A9F768730BAC81C514',
# 'useLoginAccount': 'true'}
获取cookie后,可以将获取的cookie添加到后续请求中,但由于cookie有有效期,需要定期更新;
这可以通过设计cookie池,动态定期登录一批账号,获取cookie后将cookie存入数据库(redis、MySQL等)来实现。
请求时从数据库中获取一个可用的cookie,并添加到访问请求中;
尝试使用pyqt5抓取数据(PyQt 5.9.2)
import sys
import csv
import pyquery
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
class Browser(QWebEngineView):
def __init__(self):
super(Browser, self).__init__()
self.__results = []
self.loadFinished.connect(self.__result_available)
@property
def results(self):
return self.__results
def __result_available(self):
self.page().toHtml(self.__parse_html)
def __parse_html(self, html):
pq = pyquery.PyQuery(html)
for rows in [pq.find("#table_list tr"), pq.find("#more_list tr")]:
for row in rows.items():
columns = row.find("td")
d = {
"avatar": columns.eq(1).find("img").attr("src"),
"url": columns.eq(1).find("a").attr("href"),
"name": columns.eq(1).find("a").attr("title"),
"fans_number": columns.eq(2).text(),
"view_num": columns.eq(3).text(),
"comment_num": columns.eq(4).text(),
"post_count": columns.eq(5).text(),
"newrank_index": columns.eq(6).text(),
}
self.__results.append(d)
with open("results.csv", "a+", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["name", "fans_number", "view_num", "comment_num", "post_count",
"newrank_index", "url", "avatar"])
writer.writerows(self.results)
def open(self, url: str):
self.load(QUrl(url))
if __name__ == '__main__':
app = QApplication(sys.argv)
browser = Browser()
browser.open("https://www.newrank.cn/public/info/list.html?period=toutiao_day&type=data")
browser.show()
app.exec_()
持续更新:
5. 使用 Fiddler 抓包分析
浏览器抓包 fiddler 手机抓包
6. 使用anyproxy 捕获客户端数据-客户端数据采集
7. 高性能爬虫开发总结
获取免费爬虫视频资料加887934385交流群