知识点目录
1.同步和异步
2.url中出现中文怎么办?(需要进行编码)
3.xpath的基本用法有哪些
4.return 和yield的区别
5.未知总页数如何采集所有页的基本逻辑
6.爬虫解析的数据格式包括哪些
7.解析数据的手段有哪些
8.网址拼接的方式有哪些
9.TODO是什么东西
1.同步和异步
同步:顺序执行,如果上一步没执行完则一直等待(阻塞)
异步:无序执行,不需要等待上一步就可以执行下一步
2.url中出现中文怎么办?(需要进行编码)
# url中不能出现汉字,一般经过编码
# 浏览器为了提升用户体验,会自动解析
# requests会自动对汉字编码
3.xpath的基本用法有哪些
import requests
from lxml import etree
headers={}
url="http://www.ivsky.com/"
response = requests.get(url,headers=headers)
root = etree.HTML(response.text)
print(root)
# xpath的特点
# 1.匹配到的数据一定是个列表
# 2.列表中只存在两种值,Element(元素),字符串
# 3.如果是元素,则元素本身可以继续调用xpath
# 1.//标签名 从整个网页中匹配所有符合要求的标签
a_list = root.xpath("//a")
print(a_list)
# 2.标签名/@属性名
a_list = root.xpath("//a/@href")
print(a_list)
# 3.标签名/text()
a_list = root.xpath("//a/text()")
print(a_list)
# 4.标签名[@属性名='属性具体的值']
# 根据id查找最多找到一个元素
# 因为每个id对应的值只能在同一页面出现一次,不能重复
# 而class的值可以重复
ul_ele = root.xpath("//ul[@id='menu']")[0]
print(ul_ele)
div_class=root.xpath("//div[@class='box']")
print(div_class)
# 5.标签名[text()='具体内容']
load_more = root.xpath("//b[text()='点击加载更多图片']")
print(load_more)
# 6.标签名[contains(@属性名,'属性包含的文本')]
# 6.标签名[contains(text(),'属性包含的文本')]
a_list = root.xpath("//a[contains(text(),'桌面壁纸')]")
print(a_list)
b_list = root.xpath("//li[contains(@class,'kw_on')]")
print(b_list)
4.return 和yield的区别
return与,yield
1,return只能返回一次函数就彻底结束了。而yield能返回多次值。
2,yield把函数变成生成器—迭代器—>把iter,next方法给到函数了。为我们自己定义迭代器,提供了方便。
3,yield能保存函数在暂停,和继续下一次运行的状态
yield 生成器相比 return一次返回所有结果的优势:
(1)反应更迅速
(2)更节省空间
(3)使用更灵活
5.未知总页数如何采集所有页的基本逻辑
代码实现
page = 1
while True:#由于不知道总页数,需要让它一直循环
perpage_url = url + f"index_{page}.html"
root = etree.HTML(cls.get(perpage_url))
imgs = root.xpath("//img/@src")
for img_src in imgs:
img_src = "http:" + img_src if not img_src.startswith("http") else img_src
img_name = img_src.split("/")[-1]
big_img_src = img_src.replace("/t/", "/pre/")
big_img_name = "big_" + img_name
yield img_name, img_src, big_img_name, big_img_src
if not imgs: # 当最后一页没有数据的时候就可以判断循环终止了
print("到达最后一页")
break # 结束循环
page += 1
6.爬虫解析的数据格式包括哪些
# 解析数据的格式
# 网页数据
# JSON数据
# 字符串
7.解析数据的手段有哪些
# 解析数据的方式
# 网页数据
# xpath, 正则表达式, BeautifulSoup简称bs4, css选择器, pyquery
# JSON数据
url=""
response=requests.get(url)
response.json()
# 系统自带json,jsonpath,demjson
# 字符串
# 正则表达式, 替换/查找/切割...
# 案例
# 1.在百度中搜索关键字,然后采集对应的标题和简介,匹配相似度
# 标题的简介中不能有图片
# 因为本例xpath设计的只能匹配标题简介不能有图片的
import requests
from lxml import etree
from db_tool import DBTool
class BaiduSpider:
db=""
@classmethod
def get(cls, url,is_text=True):
headers = {}
# 获取源码
response = requests.get(url, headers=headers)
# 解决乱码
response.encoding=response.apparent_encoding
return response.text if is_text else response.content
@classmethod
def parse_one_page(cls):
# TODO 明天从这写
print("开始解析页面源码")
root =etree.HTML(cls.__page)
infos = root.xpath("//div[@id='content_left']/div")
# Element:元素 若变量为元素,则可以调用xpath
for info in infos:
title = info.xpath("h3/a//text()")
if not title:
print("这是广告")
continue
url = info.xpath("h3/a/@href")[0]
introduce = info.xpath("div[1]//text()")
title = "".join(title)
introduce = "".join(introduce)
match="100%" if cls.__keyword in title or cls.__keyword in introduce else "0%"
cls.save_to_sqlite(title, introduce, url,match)
print("结束解析页面源码")
@classmethod
def parse_all_page(cls):
for page in range(cls.__total_page):
url = f"http://www.baidu.com/s?wd={cls.__keyword}&pn={page*10}"
page = cls.get(url)
cls.__page=page
cls.parse_one_page()
@classmethod
def save_to_sqlite(cls,*args):
if not cls.db:
db = DBTool(cls.__db_name)
db.create_table("""
CREATE TABLE IF NOT EXISTS `baidu`(
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`title` VARCHAR (255),
`introduce` VARCHAR (255),
`url` VARCHAR(255),
`match` VARCHAR(5)
)
""")
db.insert("""
INSERT INTO `baidu` (`title`,`introduce`,`url`,`match`) VALUES
(?,?,?,?)
""",(args,))
@classmethod
def search(cls,keyword,total_page=10,db_name="baidu.sqlite"):
cls.__keyword = keyword
cls.__total_page = total_page
cls.__db_name = db_name
# url中不能出现汉字,一般经过编码
# 浏览器为了提升用户体验,会自动解析
# requests会自动对汉字编码
cls.parse_all_page()
return db_name
path = BaiduSpider.search("python解析json")
print(path)
# path=BaiduSpider.search("turtle库详解")
# print(path)
8.网址拼接的方式有哪些
# 网址的拼接方式
# 1.href="" +href
# 2.from urllib.parse import urljoin
# href = urljoin("",href)
9.TODO是什么东西
TODO 明天从这写
TODO可以改变注释的颜色,在控制台下的TODO中可以很清楚的看到注释的代码在哪,一目了然