知识点目录
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 明天从这写

python easygui返回按钮_python easygui返回按钮


TODO可以改变注释的颜色,在控制台下的TODO中可以很清楚的看到注释的代码在哪,一目了然