python学习(二):python的数据挖掘技术,网络爬虫

     *                                          匹配前面的字符 0 或无限次
    +                                          匹配前面的字符1 或无限次
    ?                                         匹配前面的字符0 或1
   {n}                                         匹配前面的字符n次
   {n,}                                        匹配前面的字符最少n次
   {n,m}                                      匹配前面的字符最少n次,最多m次

括号的作用
(1)、将原子1,2,3,4,5,6 a, b, d变成大原子
(2).在括号可以│ 或的关系
(3).反向引用replace
(4).^[\(].*?[\)]$              ^与$共同确定首尾数据
(5).  [^\(]                    匹配除( 以外的字符
(6). *?                       大部分都要考虑,?存在的意义,如果有?,则说明有很大的可能,当前匹配的部分字符是允许不存在的。
(7). [\S]*                     在数据前面可以添加?,但在后面的数据,要省略?。否则无法获取的后面的数据。如果有?,则会直接忽略。
(8). (.+?)[=](.*)?          (.+?)[=](.*)?

中国号的作用:
[]只能匹配一个字符,不允许不同的字符出现在同一个[]内,大小写除外
表示范围,一般会与[]一起使用,点号 [.] 或\.   空格可以使用[ ]

注意:
1. ()组成的原子、[]组成 的单字符,.等代表的单字符 后面都可以 使用限定符
()一般是单字符,()一般是多字符,组成的大原子 ,但也可以是单字符
2.直接使用正则表达式,不需要/ .../ig
3. res = re.findall(r'url(.*?)',new_str)
注意括号的使用,因为是使用在re.findall(),里面不要有多余的空格 ,
每个括号都会被匹配成一个结果,最后返回的是由元组组成的列表,而不是字符串组成的列表,
4. res = re.sub(r'url(.*?)',' \\1:\\2 .js',new_str)
前面匹配的是原字符串的正则表达式,后面是替换的目标对象,\\n是匹配到的原字符串
正则表达式没有匹配到结果,则不会进行替换操作,只返回原字符串
5. pattern = re.compare(r'(\w+)(\w+)')
将正则表达式编译成pattern对象
6. res = re.match(pattern,new_str)
匹配数据,开头如果匹配失败就立刻返回None,
7. res = re.search(pattern,new_str).group()
查找数据,前面的search返回的是一个对象,匹配失败会返回None,常用作查找数据是否存在 slash_exist !=None
group()返回的是匹配的字符串,
8. list = re.split(pattern,'xxx')
通过正则表达式分割字符串,并返回一个列表,对于不确定的字符分割很有效

例子:
(1.   [(\')|(\")]                                        表示' 或 "中一个 表示
(2. [0-9](1,3}(\ .[0-9]{1,3} ){3}                        匹配127.0.0.1
(3. items = re.findall(r'([\w]+?[.]css)', items)[0]      匹配xxx.css, 单字符尽量使用[]而不是(),
单词字符只有一个字符,并不能单独使用去匹配一个完整的单词
(4. host = re.findall(r'((http[s]?)|(ftp))+(://)(([\w]+?[.])+([\w]+){1})[/]?',url)        匹配网址url的域名
host = re.findall(r'((http[s]?)|(ftp))+(://)([\S]+?)[/]',url)                              和上面是相同的效果
pre_url = re.findall(r'((http[s]?)|(ftp))+(://)(([\w]+?[.])+([\w]+){1})([/]+([\S]+?[.]{1}[\w]*)+?)*',url)
获取网址的域名
pre_url = re.findall(r'((http[s]?)|(ftp))+(://)(((\w|-|_)+?[.])+((\w|-|_)*){1})(([/]+([\S]+?[.]?[\S]*)+?)*([/]?[?]?)?)?',url)
获取网址的所有信息

实战:
import re

headers_str='''
bootstrap.min.js
bootstrap.css
bootstrap-icons.css
'''
pattern = '(.+?)[.]js'
            1     2
for line in headers_str.splitlines():
    res = re.sub(pattern,'\\1.js',line)
    print(res)

from bs4 import BeautifulSoup
三、BeautifulSoup.bs4模块
1.find返回第一个标签,
2.find_all返回一个列表,包含所有标签
3.find_all和find使用 (标签,class_='类名'),选择指定节点。
4.都有.get('xxx')方法 .get_text('xxx')方法 .text方法  .标签["属性"] 方法, 获取属性或者内容
5.使用 “.标签”  获取标签的子节点

1.select 是selector css选择器,可以根据css选择器语句选择节点,可以包含路径。
注意:但这与Selector的css选择器不一样。
2.select可以使用路径,但返回的是一个列表。
并且可以使用.get(), .get_text(),.text方法, 可以和find类型进行混合使用。
3..print.printify()格式化打印

下面的是等价的
div_list = dom_tree.select('div.quote')
div_list = dom_tree.find_all('div',class_='quote')

soup = BeautifulSoup(music_res.text,'lxml')
html.parser或者'lxml'
print(soup.title)                   # soup.title.string &#x83B7;&#x5F97;&#x6807;&#x9898;   # soup.title&#x83B7;&#x5F97;&#x6807;&#x9898;&#x6807;&#x7B7E;&#xFF08;&#x6587;&#x672C;&#x52A0;&#x6807;&#x7B7E;<>&#xFF09;
print(soup.a['href'])               # soup.a['href'],&#x83B7;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;a&#x6807;&#x7B7E;&#x7684;href&#x5C5E;&#x6027;
print(soup.find('a').get('href'))   # soup.find('a').get('href')  &#x83B7;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;a&#x6807;&#x7B7E;&#x7684;href&#x5C5E;&#x6027;

print(soup.find_all('a'))         #  find_all['a']   &#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x6240;&#x6709;a&#x6807;&#x7B7E;&#xFF0C;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5217;&#x8868;&#x3002;
for s in soup.find_all('a'):      #  .get('href')    &#x53EF;&#x4EE5;&#x83B7;&#x53D6;a&#x6807;&#x7B7E;&#x4E0B;&#x7684;href&#x5C5E;&#x6027;
    print(s.get_text('href'))     #  .get_text('href')&#x53EF;&#x4EE5;&#x83B7;&#x53D6;a&#x6807;&#x7B7E;href&#x5C5E;&#x6027;&#x6240;&#x5728;&#x884C;&#x7684;&#x6587;&#x672C;&#x5185;&#x5BB9;
    print(s.text)                 #  .text           &#x53EF;&#x4EE5;&#x83B7;&#x53D6;a&#x6807;&#x7B7E;&#x4E0B;&#x7684;&#x6587;&#x672C;&#x5185;&#x5BB9;

soup1 = soup.find('div',class_="data__cont")
music_name1 = soup1.find('div',class_='data__name').text.strip('\n')
&#x8FD9;&#x4E2A;&#x6807;&#x7B7E;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6587;&#x672C;&#x4FE1;&#x606F;
music_name2 = soup1.find('div',class_='data__name').find('h1').text
music_name3 = soup1.find('div',class_='data__name').find('h1').get('title')
get_text('title')&#x4E5F;&#x53EF;&#x4EE5;
singer_name = soup1.find('div',class_='data__singer').get('title').replace(' / ','/')
print(singer_name + '-' + music_name1)

&#x521B;&#x5EFA;&#x722C;&#x866B;&#xFF0C;&#x5206;&#x6790;&#x76EE;&#x6807;&#x7F51;&#x9875;&#x5185;&#x5BB9;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;xpath&#x65B9;&#x6CD5;&#xFF0C;&#x6216;&#x8005;Css&#x9009;&#x62E9;&#x5668;&#x7684;&#x65B9;&#x6CD5;&#x3002;
&#x4EE5;&#x4E0B;&#x4ECB;&#x7ECD;&#x5E38;&#x7528;&#x7684;Css&#x9009;&#x62E9;&#x5668;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;

&#x8868;&#x8FBE;&#x5F0F;                                                 &#x8BF4;&#x660E;
*                                   &#x9009;&#x62E9;&#x6240;&#x6709;&#x8282;&#x70B9;
container                           &#x9009;&#x62E9;id&#x4E3A;container&#x7684;&#x8282;&#x70B9;&#x5143;&#x7D20;
.container                          &#x9009;&#x53D6;&#x6240;&#x6709;class&#x5305;&#x542B;container&#x7684;&#x8282;&#x70B9;&#x5143;&#x7D20;
div # container > ul                &#x9009;&#x53D6;id&#x4E3A;container&#x7684;div&#x8282;&#x70B9;&#x4E0B;&#x9762;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;ul&#x5B50;&#x5143;&#x7D20;
li a                                &#x9009;&#x53D6;li&#x5143;&#x7D20;&#x4E0B;&#x9762;&#x6240;&#x6709;&#x7684;a&#x8282;&#x70B9;&#x5143;&#x7D20;
ul + p                              &#x9009;&#x62E9;ul&#x540E;&#x9762;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;p&#x5143;&#x7D20;
ul ~ p                              &#x9009;&#x53D6;&#x4E0E;ul&#x76F8;&#x90BB;&#x7684;&#x6240;&#x6709;p&#x5143;&#x7D20;
li:nth-child(3)                     &#x9009;&#x53D6;&#x7B2C;&#x4E09;&#x4E2A;li&#x5143;&#x7D20;
tr:nth-child(2n)                    &#x9009;&#x53D6;&#x5076;&#x6570;&#x884C;
h1::text                            &#x4F2A;&#x7C7B;&#x9009;&#x62E9;&#x5668;,&#x83B7;&#x53D6; h1 &#x6807;&#x7B7E;&#x5185;&#x7684;&#x6587;&#x672C;
a::attr(href)                       &#x4F2A;&#x7C7B;&#x9009;&#x62E9;&#x5668;,&#x83B7;&#x53D6;a&#x8FDE;&#x63A5;href&#x5C5E;&#x6027;&#x503C; &#x300A;&#x300A;&#x300A;&#x300A;
a[title]                            &#x9009;&#x53D6;&#x6240;&#x6709;&#x5177;&#x6709; title&#x5C5E;&#x6027;&#x7684;a&#x5143;&#x7D20;
a[href=&#x201C;http://51xiudao.cn&#x201D;]        &#x9009;&#x53D6;&#x6240;&#x6709;href&#x5C5E;&#x6027;&#x4E3A;51xiudao.cn&#x503C;&#x5F97;a&#x5143;&#x7D20;
a[href*=&#x201D;51xiudao&#x201D;]                   &#x9009;&#x53D6;&#x6240;&#x6709;href&#x5C5E;&#x6027;&#x5305;&#x542B;51xiudao&#x7684;a&#x5143;&#x7D20;
a[href^=&#x201D;http&#x201D;]                       &#x9009;&#x53D6;&#x6240;&#x6709;href&#x4EE5;http&#x5F00;&#x5934;&#x7684;a&#x5143;&#x7D20;
a[href$=&#x201D;.jpg&#x201D;]                       &#x9009;&#x53D6;&#x6240;&#x6709;href&#x4EE5; .jpg &#x7ED3;&#x5C3E;&#x7684;a&#x5143;&#x7D20;
&#x4EE5;&#x4E0A;&#x4E09;&#x9879;&#x4E2D; * ^ $ &#x6D89;&#x53CA;&#x5230;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x7684;&#x76F8;&#x5173;&#x5185;&#x5BB9;
input[type=radio]:checked           &#x9009;&#x62E9;&#x5BA3;&#x5DDE;&#x7684;radio&#x5143;&#x7D20;
div:not(#container)                 &#x9009;&#x62E9;&#x6240;&#x6709;id&#x4E0D;&#x7B49;&#x4E8E;container&#x7684;div&#x5143;&#x7D20;
.abc.def                            css&#x4E2D;&#x7528;&#x4E24;&#x4E2A;class&#x5B9A;&#x4F4D;&#x4E00;&#x4E2A;&#x5143;&#x7D20; &#x4F8B;&#x5982;< div class=&#x201D;abc def&#x201D; >xxx< / div>
&#x6CE8;&#x610F;&#xFF1A;
&#x89E3;&#x6790;&#x65B9;&#x6CD5;&#x4E00;
import parsel
selector = parsel.Selector(response.text)
title = selector.css('div.data__name h1::attr(title)').extract()[0]

&#x89E3;&#x6790;&#x65B9;&#x6CD5;&#x4E8C;
import scrapy
selector = scrapy.Selector(text=res.text)
title = selector.css('div.data__name h1::attr(title)').extract()[0]
item['title']=response.xpath('//ul[@class="bigimg"]/li/a[1]/@title').getall()

parsel&#x6A21;&#x5757;&#xFF0C;css&#x8BED;&#x6CD5;
&#x8DEF;&#x5F84;&#x52A0;&#x4E0A;::attr &#x6216;&#x8005;::text
&#x672B;&#x5C3E;&#x9700;&#x8981;&#x52A0;&#x5165;.extract()&#x6216;&#x8005;.getall()&#x65B9;&#x6CD5;&#xFF0C; scrapy&#x89E3;&#x6790;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x4E0D;&#x7BA1;&#x662F;xpath&#xFF0C;&#x8FD8;&#x662F;selector&#x90FD;&#x8981;&#x6DFB;&#x52A0;
.extract()       &#x8FD4;&#x56DE;&#x9009;&#x4E2D;&#x5185;&#x5BB9;&#x7684;Unicode&#x5B57;&#x7B26;&#x4E32;&#x3002;
.extract_first() &#x9009;&#x62E9;&#x7B2C;&#x4E00;&#x4E2A;&#xFF0C;
.getall()        &#x83B7;&#x53D6;&#x6240;&#x6709;&#x5143;&#x7D20;&#x8282;&#x70B9;
.get()           &#x83B7;&#x53D6;&#x5355;&#x4E2A;&#x5143;&#x7D20;&#x8282;&#x70B9;

css
1.&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x76F8;&#x540C;&#x5C5E;&#x6027;&#x7684;&#x5185;&#x5BB9;&#xFF08;&#x4E00;&#x4E2A;class&#x7684;&#x5C5E;&#x6027;&#x542B;&#x6709;&#x591A;&#x4E2A;&#x540C;&#x7C7B;&#x578B;&#x7684;&#x6570;&#x636E;&#xFF09;,&#x53EA;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;
2.&#x9009;&#x62E9;&#x6307;&#x5B9A;&#x7684;&#x5B50;&#x8282;&#x70B9;&#x4E5F;&#x9700;&#x8981;&#x4F7F;&#x7528;:nth-child(n)
3.&#x6700;&#x5F00;&#x59CB;&#x7684;&#x8DEF;&#x5F84;&#x9700;&#x8981;&#x786E;&#x5B9A;&#x54EA;&#x4E00;&#x4E2A;&#x6807;&#x7B7E;
&#x672C;&#x8D28; &#x4E0A;&#x5C06;&#x6E90;&#x4EE3;&#x7801;&#x9875;&#x9762;&#xFF0C;&#x8F6C;&#x6362;&#x6210;Html&#x8282;&#x70B9;&#x3002;&#xFF08;&#x5373;&#x4F1A;&#x9ED8;&#x8BA4;&#x6267;&#x884C;javascript&#xFF09;

&#x6CE8;&#x610F;&#xFF1A; class="xxx", &#x7C7B;&#x540D;&#x9700;&#x8981;&#x5199;&#x5168;&#xFF0C;&#x5426;&#x5219;&#x65E0;&#x6548;

nodename    &#x9009;&#x53D6;&#x6B64;&#x8282;&#x70B9;&#x7684;&#x6240;&#x6709;&#x5B50;&#x8282;&#x70B9;&#x3002;
/   &#x4ECE;&#x6839;&#x8282;&#x70B9;&#x9009;&#x53D6;&#x3002;
//  &#x4ECE;&#x5339;&#x914D;&#x9009;&#x62E9;&#x7684;&#x5F53;&#x524D;&#x8282;&#x70B9;&#x9009;&#x62E9;&#x6587;&#x6863;&#x4E2D;&#x7684;&#x8282;&#x70B9;&#xFF0C;&#x800C;&#x4E0D;&#x8003;&#x8651;&#x5B83;&#x4EEC;&#x7684;&#x4F4D;&#x7F6E;&#x3002; &#xFF08;//&#x53CC;&#x659C;&#x6760;&#x4EE3;&#x8868;&#x6240;&#x6709;&#xFF09;
.   &#x9009;&#x53D6;&#x5F53;&#x524D;&#x8282;&#x70B9;&#x3002;
..  &#x9009;&#x53D6;&#x5F53;&#x524D;&#x8282;&#x70B9;&#x7684;&#x7236;&#x8282;&#x70B9;&#x3002;
@   &#x9009;&#x53D6;&#x5C5E;&#x6027;&#x3002;
*   &#x5339;&#x914D;&#x4EFB;&#x4F55;&#x5143;&#x7D20;&#x8282;&#x70B9;&#x3002;                  //*   &#x9009;&#x53D6;&#x6587;&#x6863;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x5143;&#x7D20;&#x3002;
@*  &#x5339;&#x914D;&#x4EFB;&#x4F55;&#x5C5E;&#x6027;&#x8282;&#x70B9;&#x3002;
node()  &#x5339;&#x914D;&#x4EFB;&#x4F55;&#x7C7B;&#x578B;&#x7684;&#x8282;&#x70B9;&#x3002;                //title[@*] &#x9009;&#x53D6;&#x6240;&#x6709;&#x5E26;&#x6709;&#x5C5E;&#x6027;&#x7684; title &#x5143;&#x7D20;&#x3002;
text()  &#x5339;&#x914D;&#x6587;&#x672C;
tr.xpath('td[1]/text()').get() &#xFF0C; &#x9009;&#x53D6;td[1]&#x4E0B;&#x7684;&#x6587;&#x672C;


&#x6CE8;&#x610F;&#xFF1A;
&#x89E3;&#x6790;&#x65B9;&#x6CD5;&#x4E00;&#xFF1A;parsel&#x6A21;&#x5757;
import parsel
selector = parsel.Selector(response.text)
trs = selector.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')[0]
title = trs.xpath('td[2]/text()').get()
get() :&#x83B7;&#x53D6;&#x5355;&#x72EC;&#x7684;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x6570;&#x636E;&#xFF0C;&#x5426;&#x5219;&#x83B7;&#x53D6;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x5BF9;&#x8C61;
&#x6CE8;&#x610F;&#xFF1A;&#x8FD9;&#x662F;[ ] &#x91CC;&#x9762;&#x7684;&#x8D77;&#x59CB;&#x503C;&#x662F;1&#xFF0C;&#x8DEF;&#x5F84;&#x4E0D;&#x80FD;&#x4EE5; / &#x659C;&#x6760;&#x7ED3;&#x5C3E;

&#x89E3;&#x6790;&#x65B9;&#x6CD5;&#x4E8C;&#xFF1A;etree&#x6A21;&#x5757;
from lxml import etree
html = etree.HTML(music_res.text)
music_name = html.xpath('//div[@class="data__name"]/h1/@title')[0]
lxml&#x6A21;&#x5757; xpath&#x8BED;&#x6CD5;
singer_name = html.xpath('//div[@class="data__singer"]/@title')[0]
&#x8DEF;&#x5F84;&#x52A0;&#x4E0A;@XXX &#x6216;&#x8005;text()
&#x53E6;&#x4E00;&#x79CD;xpath&#x8BED;&#x6CD5;&#x662F;&#x5728;&#x672B;&#x5C3E;&#x52A0;&#x4E0A;.text

&#x5B9E;&#x4F8B;&#xFF1A;
bookstore                  &#x9009;&#x53D6; bookstore &#x5143;&#x7D20;&#x7684;&#x6240;&#x6709;&#x5B50;&#x8282;&#x70B9;&#x3002;
/bookstore                 &#x9009;&#x53D6;&#x6839;&#x5143;&#x7D20; bookstore&#x3002;
&#x6CE8;&#x91CA;&#xFF1A;&#x5047;&#x5982;&#x8DEF;&#x5F84;&#x8D77;&#x59CB;&#x4E8E;&#x6B63;&#x659C;&#x6760;( / )&#xFF0C;&#x5219;&#x6B64;&#x8DEF;&#x5F84;&#x59CB;&#x7EC8;&#x4EE3;&#x8868;&#x5230;&#x67D0;&#x5143;&#x7D20;&#x7684;&#x7EDD;&#x5BF9;&#x8DEF;&#x5F84;&#xFF01;
bookstore/book             &#x9009;&#x53D6;&#x5C5E;&#x4E8E; bookstore &#x7684;&#x5B50;&#x5143;&#x7D20;&#x7684;&#x6240;&#x6709; book &#x5143;&#x7D20;&#x3002;
//book                     &#x9009;&#x53D6;&#x6240;&#x6709; book &#x5B50;&#x5143;&#x7D20;&#xFF0C;&#x800C;&#x4E0D;&#x7BA1;&#x5B83;&#x4EEC;&#x5728;&#x6587;&#x6863;&#x4E2D;&#x7684;&#x4F4D;&#x7F6E;&#x3002;
bookstore//book            &#x9009;&#x62E9;&#x5C5E;&#x4E8E; bookstore &#x5143;&#x7D20;&#x7684;&#x540E;&#x4EE3;&#x7684;&#x6240;&#x6709; book &#x5143;&#x7D20;&#xFF0C;&#x800C;&#x4E0D;&#x7BA1;&#x5B83;&#x4EEC;&#x4F4D;&#x4E8E; bookstore &#x4E4B;&#x4E0B;&#x7684;&#x4EC0;&#x4E48;&#x4F4D;&#x7F6E;&#x3002;
//@lang                    &#x9009;&#x53D6;&#x540D;&#x4E3A; lang &#x7684;&#x6240;&#x6709;&#x5C5E;&#x6027;&#x3002;

/bookstore/book[1]         &#x9009;&#x53D6;&#x5C5E;&#x4E8E; bookstore &#x5B50;&#x5143;&#x7D20;&#x7684;&#x7B2C;&#x4E00;&#x4E2A; book &#x5143;&#x7D20;&#x3002;
/bookstore/book[last()]    &#x9009;&#x53D6;&#x5C5E;&#x4E8E; bookstore &#x5B50;&#x5143;&#x7D20;&#x7684;&#x6700;&#x540E;&#x4E00;&#x4E2A; book &#x5143;&#x7D20;&#x3002;
/bookstore/book[last()-1]  &#x9009;&#x53D6;&#x5C5E;&#x4E8E; bookstore &#x5B50;&#x5143;&#x7D20;&#x7684;&#x5012;&#x6570;&#x7B2C;&#x4E8C;&#x4E2A; book &#x5143;&#x7D20;&#x3002;
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 title[@lang] 选取所有拥有名为 lang 的属性的 title title[@lang="eng" ] 选取所有 元素,且这些元素拥有值为 eng 的 属性。 book[price>35.00]     &#x9009;&#x53D6; bookstore &#x5143;&#x7D20;&#x7684;&#x6240;&#x6709; book &#x5143;&#x7D20;&#xFF0C;&#x4E14;&#x5176;&#x4E2D;&#x7684; price &#x5143;&#x7D20;&#x7684;&#x503C;&#x987B;&#x5927;&#x4E8E; 35.00&#x3002;
/bookstore/book[price>35.00]/title  &#x9009;&#x53D6; bookstore &#x5143;&#x7D20;&#x4E2D;&#x7684; book &#x5143;&#x7D20;&#x7684;&#x6240;&#x6709; title &#x5143;&#x7D20;&#xFF0C;&#x4E14;&#x5176;&#x4E2D;&#x7684; price &#x5143;&#x7D20;&#x7684;&#x503C;&#x987B;&#x5927;&#x4E8E; 35.00&#x3002;

/bookstore/*                        &#x9009;&#x53D6; bookstore &#x5143;&#x7D20;&#x7684;&#x6240;&#x6709;&#x5B50;&#x5143;&#x7D20;&#x3002;
//*                                 &#x9009;&#x53D6;&#x6587;&#x6863;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x5143;&#x7D20;&#x3002;
//title[@*]                         &#x9009;&#x53D6;&#x6240;&#x6709;&#x5E26;&#x6709;&#x5C5E;&#x6027;&#x7684; title &#x5143;&#x7D20;&#x3002;
//book/title | //book/price         &#x9009;&#x53D6; book &#x5143;&#x7D20;&#x7684;&#x6240;&#x6709; title &#x548C; price &#x5143;&#x7D20;&#x3002;
//title | //price                   &#x9009;&#x53D6;&#x6587;&#x6863;&#x4E2D;&#x7684;&#x6240;&#x6709; title &#x548C; price &#x5143;&#x7D20;&#x3002;
/bookstore/book/title | //price &#x9009;&#x53D6;&#x5C5E;&#x4E8E; bookstore &#x5143;&#x7D20;&#x7684; book &#x5143;&#x7D20;&#x7684;&#x6240;&#x6709; title &#x5143;&#x7D20;&#xFF0C;&#x4EE5;&#x53CA;&#x6587;&#x6863;&#x4E2D;&#x6240;&#x6709;&#x7684; price &#x5143;&#x7D20;&#x3002;
</3]>
jsonpath&#x64CD;&#x4F5C;&#x7B26;&#xFF1A;

&#x64CD;&#x4F5C;                                              &#x8BF4;&#x660E;
$                                          &#x67E5;&#x8BE2;&#x6839;&#x5143;&#x7D20;&#x3002;&#x8FD9;&#x5C06;&#x542F;&#x52A8;&#x6240;&#x6709;&#x8DEF;&#x5F84;&#x8868;&#x8FBE;&#x5F0F;&#x3002;
@                                          &#x5F53;&#x524D;&#x8282;&#x70B9;&#x7531;&#x8FC7;&#x6EE4;&#x8C13;&#x8BCD;&#x5904;&#x7406;&#x3002;
*                                          &#x901A;&#x914D;&#x7B26;&#xFF0C;&#x5FC5;&#x8981;&#x65F6;&#x53EF;&#x7528;&#x4EFB;&#x4F55;&#x5730;&#x65B9;&#x7684;&#x540D;&#x79F0;&#x6216;&#x6570;&#x5B57;&#x3002;
..                                          &#x6DF1;&#x5C42;&#x626B;&#x63CF;&#x3002; &#x5FC5;&#x8981;&#x65F6;&#x5728;&#x4EFB;&#x4F55;&#x5730;&#x65B9;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x540D;&#x79F0;&#x3002;
.<name>                                         &#x70B9;&#xFF0C;&#x8868;&#x793A;&#x5B50;&#x8282;&#x70B9;
['<name>' (, '<name>')                      &#x62EC;&#x53F7;&#x8868;&#x793A;&#x5B50;&#x9879;
[<number> (, <number>)]                     &#x6570;&#x7EC4;&#x7D22;&#x5F15;&#x6216;&#x7D22;&#x5F15;
[start:end]                                 &#x6570;&#x7EC4;&#x5207;&#x7247;&#x64CD;&#x4F5C;
[?(<expression>)]                           &#x8FC7;&#x6EE4;&#x8868;&#x8FBE;&#x5F0F;&#x3002; &#x8868;&#x8FBE;&#x5F0F;&#x5FC5;&#x987B;&#x6C42;&#x503C;&#x4E3A;&#x4E00;&#x4E2A;&#x5E03;&#x5C14;&#x503C;&#x3002;
</expression></number></number></name></name></name>

&#x6CE8;&#x610F;&#xFF1A;
&#x4E0E;css&#xFF0C;xpath&#x9009;&#x62E9;&#x5668;&#x4E0D;&#x540C;&#xFF0C;jsonpath&#x5904;&#x7406;&#x7684;&#x53EA;&#x662F;json&#x683C;&#x5F0F;&#x4E0B;&#x7684;&#x5B57;&#x5178;&#x6570;&#x636E;&#x3002;
json_text = res.json()
authors = jsonpath.jsonpath(json_text,'$..author')
json_text&#x5FC5;&#x987B;&#x653E;&#x5728;&#x524D;&#x9762;

&#x5C06;&#x6587;&#x672C;&#x8F6C;&#x6362;&#x6210;json&#x5BF9;&#x8C61;&#xFF08;&#x5FC5;&#x987B;&#x662F;&#x53CC;&#x5F15;&#x53F7;&#xFF09;
data = json.loads(res.text)    # data = res.json()
picturl_urls = jsonpath.jsonpath(data,'$..value.0.url')
titles = jsonpath.jsonpath(data,'$..1.value')

&#x5B57;&#x7B26;&#x4E32;&#x8F6C;&#x6362;&#x6210;json&#x5BF9;&#x8C61;(&#x53EF;&#x80FD;&#x65E0;&#x6548;)
data = json.loads(json.dumps(res[0]), strict=False)

&#x6B63;&#x5219;&#x5339;&#x914D;&#xFF08;&#x5EFA;&#x8BAE;&#xFF09;
## &#x89E3;&#x6790;json&#x6570;&#x636E;
def re_json(text,pre,now,next):
    return re.findall (f'"{pre}".+?"{now}":"(.+?)".+?"{next}"', text)

&#x5B9E;&#x4F8B;
$..author                              &#x83B7;&#x53D6;&#x6240;&#x6709;json&#x4E2D;&#x6240;&#x6709;author&#x7684;&#x503C;
$.store.*                              &#x6240;&#x6709;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x4E66;&#x7C4D;&#x548C;&#x81EA;&#x884C;&#x8F66;
$.store..price                         &#x83B7;&#x53D6;json&#x4E2D;store&#x4E0B;&#x6240;&#x6709;price&#x7684;&#x503C;
$..book.length()                       &#x83B7;&#x53D6;json&#x4E2D;book&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
$.store.book[*].author                 &#x83B7;&#x53D6;json&#x4E2D;store&#x4E0B;book&#x4E0B;&#x7684;&#x6240;&#x6709;author&#x503C;
$..book[2]                             &#x83B7;&#x53D6;json&#x4E2D;book&#x6570;&#x7EC4;&#x7684;&#x7B2C;3&#x4E2A;&#x503C;
$..book[-2]                            &#x5012;&#x6570;&#x7684;&#x7B2C;&#x4E8C;&#x672C;&#x4E66;
$..book[0,1]                           &#x524D;&#x4E24;&#x672C;&#x4E66;
$..book[:2]                            &#x4ECE;&#x7D22;&#x5F15;0&#xFF08;&#x5305;&#x62EC;&#xFF09;&#x5230;&#x7D22;&#x5F15;2&#xFF08;&#x6392;&#x9664;&#xFF09;&#x7684;&#x6240;&#x6709;&#x56FE;&#x4E66;
$..book[1:2]                           &#x4ECE;&#x7D22;&#x5F15;1&#xFF08;&#x5305;&#x62EC;&#xFF09;&#x5230;&#x7D22;&#x5F15;2&#xFF08;&#x6392;&#x9664;&#xFF09;&#x7684;&#x6240;&#x6709;&#x56FE;&#x4E66;
$..book[-2:]                           &#x83B7;&#x53D6;json&#x4E2D;book&#x6570;&#x7EC4;&#x7684;&#x6700;&#x540E;&#x4E24;&#x4E2A;&#x503C;
$..book[2:]                            &#x83B7;&#x53D6;json&#x4E2D;book&#x6570;&#x7EC4;&#x7684;&#x7B2C;3&#x4E2A;&#x5230;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x7684;&#x533A;&#x95F4;&#x503C;
$..book[?(@.isbn)]                     &#x83B7;&#x53D6;json&#x4E2D;book&#x6570;&#x7EC4;&#x4E2D;&#x5305;&#x542B;isbn&#x7684;&#x6240;&#x6709;&#x503C;
$.store.book[?(@.price < 10)]          &#x83B7;&#x53D6;json&#x4E2D;book&#x6570;&#x7EC4;&#x4E2D;price<10的所有值 $..book[?(@.price <="$['expensive'])]" 获取json中book数组中price<="expensive&#x7684;&#x6240;&#x6709;&#x503C;" $..book[?(@.author="~" .*rees i)] 获取json中book数组中的作者以rees结尾的所有值(rees不区分大小写) $..* 逐层列出json中的所有值,层级由外到内 code></10的所有值>
import requests
import parsel
import re
import concurrent.futures
import os

&#x591A;&#x7EBF;&#x7A0B;&#x722C;&#x866B;
1.  &#x5F15;&#x5165;concurrent.futures&#x6A21;&#x5757;
2. &#x8BBE;&#x7F6E;&#x7EBF;&#x7A0B; executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
                 for page in range(0, 201):
                         url = f'https://www.fabiaoqing.com/biaoqing/lists/page/{page}.html'
3.&#x63D0;&#x4EA4;&#x6570;&#x636E;        executor.submit(main, url)
4.&#x5173;&#x95ED;&#x7EBF;&#x7A0B; executor.shutdown()

def get_response(html_url):
    """&#x6A21;&#x62DF;&#x6D4F;&#x89C8;&#x5668;&#x8BF7;&#x6C42;&#x7F51;&#x5740;&#xFF0C;&#x83B7;&#x5F97;&#x7F51;&#x9875;&#x6E90;&#x4EE3;&#x7801;"""
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }
    response = requests.get(url=html_url, headers=headers)
    return response

def change_title(title):
    """&#x6B63;&#x5219;&#x5339;&#x914D;&#x7279;&#x6B8A;&#x5B57;&#x7B26;&#x6807;&#x9898;"""
    pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]")                      # '/ \ |  < > : * ? " '
    new_title = re.sub(pattern, "_", title)  # &#x66FF;&#x6362;&#x4E3A;&#x4E0B;&#x5212;&#x7EBF;
    return new_title

def save(img_url, title):
    """&#x4FDD;&#x5B58;&#x8868;&#x60C5;&#x5230;&#x672C;&#x5730;&#x6587;&#x4EF6;"""
    img_content = get_response(img_url).content
    path = 'img\\' + title
    with open(path, mode='wb') as f:
        f.write(img_content)
        print(title)

def main(html_url):
    """&#x4E3B;&#x51FD;&#x6570;"""
    response = get_response(html_url)
    selector = parsel.Selector(response.text)
    divs = selector.css('.tagbqppdiv')
    for div in divs:
        img_url = div.css('a img::attr(data-original)').get()
        tail = img_url.split('.')[-1]
        title = div.css('a img::attr(title)').get()
        # comment =  comments[0] if len(comments) != 0 else "&#x7A7A;"
        if len(title)> 15:
            title = title.split(' ')[0]
            if len(title) > 15:
                title = title[:15]
        new_title = change_title(title) + '.' + tail
        save(img_url, new_title)

def down_directory():
    path = 'img\\'   # ./img  getcwd()+/img
    os.makedirs(path,exist_ok=True)

if __name__ == '__main__':
    down_directory()
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
    for page in range(0, 201):
        print(f'&#x7B2C;{page+1}&#x9875;&#x6B63;&#x5728;&#x722C;&#x53D6;...')
        url = f'https://www.fabiaoqing.com/biaoqing/lists/page/{page}.html'
        executor.submit(main, url)
    executor.shutdown()

&#x591A;&#x7EBF;&#x7A0B;&#x4E0E;&#x591A;&#x8FDB;&#x7A0B;&#x7684;&#x6BD4;&#x8F83;
import concurrent.futures
import time
#
def hello(data):
    time.sleep(2)
    print('time is ',data)
#
if __name__=='__main__':
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
    for i in range(0, 20):
        executor.submit(hello,i)           # &#x591A;&#x7EBF;&#x7A0B;&#x8FDB;&#x884C;&#x591A;&#x4EFB;&#x52A1;
    executor.shutdown()
#

from multiprocessing import Pool
import time

def hello(data):
    time.sleep (2)
    print ('time is ', data)

if __name__ == '__main__':
    pool = Pool(processes=5)
    i = [f'{data}' for data in range(0,20)]
    pool.map(hello,i)                              # &#x591A;&#x8FDB;&#x7A0B;&#x8FDB;&#x884C;&#x591A;&#x4E2A;&#x7A0B;&#x5E8F;
</\>
&#x722C;&#x53D6;&#x7AD9;&#x9177;Zcool&#x7F51;&#x7AD9;&#x56FE;&#x7247;
import os
import re
import asyncio
import aiohttp
import requests
import time
import pprint

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
if not os.path.exists('./&#x7AD9;&#x9177;Zcool&#x56FE;&#x7247;'):
    os.mkdir('./&#x7AD9;&#x9177;Zcool&#x56FE;&#x7247;/')

async def get_content(link):
    async with aiohttp.ClientSession() as session:
        try:
            response = await session.get(link)
            content = await response.read()
            return content
        except asyncio.exceptions.TimeoutError:
            print('timeout')
            pass
def get_content_2(link):
    response = requests.get(link,headers=headers).text
    return response

async def downloader(img):
    content = await get_content(img[1])
    # title = img.split('/')[-1]
    with open('./&#x7AD9;&#x9177;Zcool&#x56FE;&#x7247;/'+str(img[0])+'.jpg','wb') as f:
        f.write(content)
    print('&#x4E0B;&#x8F7D;&#x6210;&#x529F;',img[0],img[1])

def run():
    start = time.time()
    base_url = 'https://www.zcool.com.cn/work/content/show?p=2&objectId=6455837'  #https://www.zcool.com.cn/work/content/show?p=2&objectId=6455837
    r = requests.get(base_url,headers=headers)
    image = r.json()     # image = json.loads(r.text)
    ima = image['data']['allImageList']
    # &#x521B;&#x5EFA;&#x534F;&#x7A0B;&#x5BF9;&#x8C61;
    loop = asyncio.get_event_loop()
    # &#x6307;&#x5B9A;&#x534F;&#x548C;&#x8FD0;&#x884C;&#x4EFB;&#x52A1;
    # &#x56E0;&#x4E3A;run&#x51FD;&#x6570;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x51FD;&#x6570;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4F7F;&#x7528;ensure_future&#x53BB;&#x8C03;&#x7528;downloader   # &#x4F20;&#x5165;&#x7684;&#x53C2;&#x6570;&#x662F;&#x4E00;&#x4E2A;&#x5143;&#x7EC4;
    tasks = [asyncio.ensure_future(downloader((i,image['url']))) for i,image in enumerate(ima)]
    loop.run_until_complete(asyncio.wait(tasks))
    end = time.time()       # &#x83B7;&#x53D6;&#x65F6;&#x95F4;&#x6233;
    print('&#x5171;&#x8FD0;&#x884C;&#x4E86;'+str(end-start)+'&#x79D2;')

if __name__=='__main__':
    run()

#
import os
import re
import asyncio
import aiohttp
import requests
import time
import pprint
#
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
def down_directory():
    if not os.path.exists('./&#x7AD9;&#x9177;Zcool&#x56FE;&#x7247;'):
        os.mkdir('./&#x7AD9;&#x9177;Zcool&#x56FE;&#x7247;/')
#
async def get_content(link):
    async with aiohttp.ClientSession() as session:
        response = await session.get(link)
        content = await response.read()
        return content
# def get_content_2(link):
#     response = requests.get(link,headers=headers).text
#     return response
#
async def downloader(img):
    content = await get_content(img)
    title = img.split('/')[-1]
    with open('./&#x7AD9;&#x9177;Zcool&#x56FE;&#x7247;/'+title,'wb') as f:
        f.write(content)
    print('&#x4E0B;&#x8F7D;&#x6210;&#x529F;',img)
#
def run(url):
    start = time.time()
    res = requests.get(url=url,headers=headers)
    before_url = re.findall('data-objid="(.*?)"',res.text)[0]    # data-objid = "6455837"
    base_url = 'https://www.zcool.com.cn/work/content/show?p=2&objectId='+before_url  #https://www.zcool.com.cn/work/content/show?p=2&objectId=6455837
    r = requests.get(base_url,headers=headers)
    image = r.json()     # image = json.loads(r.text)
    # pprint.pprint(image)
    # image_list = []
    # ima = image['data']['allImageList']
    # for i in range(len(ima)):
    #     image_list.append(ima[i]['url'])
    # print(image_list)
    ima = image['data']['allImageList']
    # &#x521B;&#x5EFA;&#x534F;&#x7A0B;&#x5BF9;&#x8C61;
    loop = asyncio.get_event_loop()
    # &#x6307;&#x5B9A;&#x534F;&#x548C;&#x8FD0;&#x884C;&#x4EFB;&#x52A1;
    # &#x56E0;&#x4E3A;run&#x51FD;&#x6570;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x51FD;&#x6570;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4F7F;&#x7528;ensure_future&#x53BB;&#x8C03;&#x7528;downloader
    tasks = [asyncio.ensure_future(downloader(image['url'])) for i,image in enumerate(ima)]
    loop.run_until_complete(asyncio.wait(tasks))
    end = time.time()       # &#x83B7;&#x53D6;&#x65F6;&#x95F4;&#x6233;
    print('&#x5171;&#x8FD0;&#x884C;&#x4E86;'+str(end-start)+'&#x79D2;')
#
if __name__=='__main__':
    down_directory()
    url = 'https://www.zcool.com.cn/work/ZMjU4MjMzNDg=.html'
    run(url)


&#x4E07;&#x80FD;&#x722C;&#x866B;&#xFF0C;headers
import requests
import random
user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
    "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
    "UCWEB7.0.2.37/28/999",
    "NOKIA5700/ UCWEB7.0.2.37/28/999",
    "Openwave/ UCWEB7.0.2.37/28/999",
    "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
]
#request &#x8BF7;&#x6C42;&#x5934;&#x90E8;&#x3001;&#x7531;&#x4E8E;&#x6B64;&#x811A;&#x672C;&#x8BF7;&#x6C42;&#x4E0D;&#x540C;&#x7684;&#x7F51;&#x9875;header&#x4FE1;&#x606F;&#x4E0D;&#x4E00;&#x81F4;&#x6240;&#x4EE5;&#x672A;&#x8BBE;&#x7F6E;&#x5168;&#x5C40;&#x53D8;&#x91CF;
#&#x89E3;&#x6790;woff&#x5B57;&#x4F53;&#x5E93;&#x7684;&#x6570;&#x5B57;&#x7C7B;&#x578B;
headers1 = {'User-Agent': random.choice(user_agent),  # &#x968F;&#x673A;&#x9009;&#x53D6;&#x5934;&#x90E8;&#x4EE3;&#x7406;,&#x9632;&#x6B62;&#x88AB;&#x5C4F;&#x853D;
           'Connection': "keep-alive",
           'Host': "www.dianping.com",
           'referer': 'http://www.dianping.com/',
           'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
           }
headers2 = {'User-Agent': random.choice(user_agent),  # &#x968F;&#x673A;&#x9009;&#x53D6;&#x5934;&#x90E8;&#x4EE3;&#x7406;,&#x9632;&#x6B62;&#x88AB;&#x5C4F;&#x853D;
           'Connection': "keep-alive",
           'Host': "s3plus.meituan.net",
           'referer': 'http://www.dianping.com/',
           'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
           }
headers3 = {'User-Agent': random.choice(user_agent),  # &#x968F;&#x673A;&#x9009;&#x53D6;&#x5934;&#x90E8;&#x4EE3;&#x7406;,&#x9632;&#x6B62;&#x88AB;&#x5C4F;&#x853D;
           'Connection': "keep-alive",
           'Host': "s3plus.meituan.net",
           'referer': 'http://www.dianping.com/',
           'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
           }

&#x6D45;&#x8C08;&#x7F51;&#x9875;referer&#x7684;&#x4F5C;&#x7528;&#x4EE5;&#x53CA;&#x53CD;&#x722C;&#x866B;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6CD5;

&#x3000;&#x3000;&#x6211;&#x4EEC;&#x77E5;&#x9053;&#xFF0C;referer&#x7684;&#x4F5C;&#x7528;&#x5C31;&#x662F;&#x8BB0;&#x5F55;&#x4F60;&#x5728;&#x8BBF;&#x95EE;&#x4E00;&#x4E2A;&#x76EE;&#x6807;&#x7F51;&#x7AD9;&#x65F6;&#xFF0C;&#x5728;&#x8BBF;&#x95EE;&#x524D;&#x4F60;&#x7684;&#x539F;&#x7F51;&#x7AD9;&#x7684;&#x5730;&#x5740;&#xFF0C;&#x6BD4;&#x5982;&#x7528;Chrome&#x4ECE;&#x77E5;&#x4E4E;&#x7684;&#x67D0;&#x4E2A;&#x677F;&#x5757;&#x5230;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#xFF0C;&#x90A3;&#x4E48;&#x4F60;&#x5728;&#x7684;&#x8FD9;&#x4E2A;&#x7F51;&#x7AD9;&#x5C31;&#x662F;&#x539F;&#x7F51;&#x7AD9;&#xFF0C;&#x6309;F12&#xFF0C;&#x9009;&#x4E2D;Network&#x9009;&#x9879;&#xFF0C;&#x4ECE;&#x9875;&#x9762;&#x5185;&#x8FDB;&#x5165;&#x4E00;&#x4E2A;&#x7F51;&#x7AD9;&#xFF0C;&#x53EF;&#x4EE5;&#x4ECE;&#x8FD9;&#x4E2A;&#x7F51;&#x7AD9;&#x7684;header&#x5373;&#x5934;&#x4FE1;&#x606F;&#x4E2D;&#x770B;&#x5230;referer&#x5C31;&#x662F;&#x539F;&#x6765;&#x7684;&#x90A3;&#x4E2A;&#x7F51;&#x7AD9;&#x3002;

&#x3000;&#x3000;&#x7531;&#x4E8E;referer&#x662F;&#x8BF7;&#x6C42;&#x7F51;&#x9875;&#x4E2D;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x53D1;&#x8D77;HTTP&#x8BF7;&#x6C42;&#x4E2D;header&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x505A;&#x7F51;&#x9875;&#x7684;&#x56FE;&#x7247;&#x9632;&#x76D7;&#x94FE;&#xFF01;&#x6BD4;&#x5982;&#x4E00;&#x4E2A;&#x7F51;&#x9875;&#x7684;&#x56FE;&#xFF0C;&#x60F3;&#x7528;Python&#x4E0B;&#x8F7D;&#x5230;&#x81EA;&#x5DF1;&#x7684;&#x7535;&#x8111;&#x91CC;&#xFF0C;&#x7528;urllib.request&#x6216;&#x8005;requests&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x8BBF;&#x95EE;&#x56FE;&#x7247;&#x65F6;&#x722C;&#x4E0D;&#x4E0B;&#x6765;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;Python&#x63D0;&#x4EA4;request&#x7533;&#x8BF7;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5C31;&#x7C7B;&#x4F3C;&#x4E8E;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x7684;&#x7A7A;&#x5730;&#x5740;&#x680F;&#x91CC;&#x952E;&#x5165;&#x8FD9;&#x4E2A;&#x7F51;&#x9875;&#x7136;&#x540E;&#x8BBF;&#x95EE;&#xFF0C;

      &#x6CA1;&#x6709;referer&#xFF0C;&#x8FD9;&#x65F6;&#x7F51;&#x7AD9;&#x7684;&#x8BBE;&#x7F6E;&#x6BD4;&#x5982;&#x662F;&#x8981;&#x6C42;&#x6709;referer&#xFF0C;&#x4E14;referer&#x7684;&#x7F51;&#x7AD9;&#x5FC5;&#x987B;&#x662F;&#x4F60;&#x8FDB;&#x6765;&#x4E4B;&#x524D;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8FD9;&#x4E2A;&#x56FE;&#x7247;&#x7684;&#x4E3B;&#x9875;&#x3002;

&#x3000;&#x3000;&#x65E2;&#x7136;&#x8981;&#x6C42;&#x4F60;&#x4F20;&#x5165;&#x56FE;&#x7247;&#x4E3B;&#x9875;&#x9762;&#x7684;referer&#xFF0C;&#x5728;&#x6784;&#x9020;header&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F20;&#x5165;Referer&#x53C2;&#x6570;&#xFF08;&#x6CE8;&#x610F;R&#x8981;&#x5927;&#x5199;&#xFF09;&#xFF08;Request Headers&#x7684;referer&#xFF09;&#xFF0C;&#x5B83;&#x7684;&#x503C;&#x4E3A;&#x4E0E;&#x8FD9;&#x4E2A;&#x56FE;&#x7247;&#x94FE;&#x63A5;&#x76F8;&#x5173;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x6216;&#x8005;&#x8FD9;&#x4E2A;&#x56FE;&#x7247;&#x94FE;&#x63A5;&#x5730;&#x5740;&#x7684;&#x539F;&#x7F51;&#x7AD9;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#xFF0C;&#x4E0B;&#x9762;&#x662F;&#x4EE3;&#x7801;&#x3002;

&#x3000;&#x3000;

1.&#x6587;&#x4EF6;&#x8BFB;&#x53D6;
f.read()&#x8BFB;&#x53D6;&#x6240;&#x6709;&#x6570;&#x636E;&#xFF08;&#x6587;&#x4EF6;&#x5F88;&#x5C0F;&#xFF0C;&#x5426;&#x5219;&#x9700;&#x8981;&#x8C03;&#x7528;f.read(size)&#xFF09;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#x3002;
f.readline()&#x8BFB;&#x53D6;&#x4E00;&#x884C;&#x6570;&#x636E;
f.readlines()&#x8BFB;&#x53D6;&#x6240;&#x6709;&#x6570;&#x636E;&#xFF0C;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5217;&#x8868;&#x3002;

open&#x65B9;&#x6CD5;(f.open)&#x9700;&#x8981;&#x4F7F;&#x7528;f.close()&#x5173;&#x95ED;&#x6587;&#x4EF6;,&#x4E5F;&#x53EF;&#x80FD;&#x4F1A;&#x51FA;&#x73B0;IO&#x5F02;&#x5E38;&#x3002;
with&#x8BED;&#x53E5;(with open(path,'r')  as f:)&#x4E0D;&#x7528;close()
&#x4E00;&#x822C;&#x6587;&#x672C;&#x6587;&#x4EF6;&#x4E0D;&#x7528;'b',&#x542B;&#x4E2D;&#x6587;&#x7684;&#x6587;&#x4EF6;&#x9700;&#x8981;&#x4F7F;&#x7528;encoding='utf-8'

2.&#x5E8F;&#x5217;&#x5316;&#x4E0E;&#x53CD;&#x5E8F;&#x5217;&#x5316;
&#x5E8F;&#x5217;&#x5316;&#x5C31;&#x662F;&#x628A;&#x5185;&#x5B58;&#x4E2D;&#x7684;&#x53D8;&#x91CF;&#x8F6C;&#x6362;&#x4E3A;&#x53EF;&#x5B58;&#x50A8;&#x6216;&#x53EF;&#x4F20;&#x8F93;&#x7684;&#x8FC7;&#x7A0B;
&#x4E00;&#x822C;&#x4F7F;&#x7528;pickle&#x6A21;&#x5757;&#xFF0C;pickle.dump(d,f)
&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x5C31;&#x662F;&#x628A;&#x53D8;&#x91CF;&#x5185;&#x5BB9;&#x4ECE;&#x5E8F;&#x5217;&#x5316;&#x7684;&#x5BF9;&#x8C61;&#x91CD;&#x65B0;&#x8BFB;&#x53D6;&#x5230;&#x5185;&#x5B58;&#xFF0C;&#x79F0;&#x4E3A;&#x53CD;&#x5E8F;&#x5217;&#x5316;
&#x4E00;&#x822C;&#x4F7F;&#x7528;pickle&#x6A21;&#x5757;&#xFF0C;d = pickle.load(f)

3.web&#x524D;&#x7AEF;&#x57FA;&#x7840;
W3C&#x6807;&#x51C6; &#x5373;&#x4E07;&#x7EF4;&#x7F51;&#x8054;&#x76DF;
&#x7F51;&#x9875;&#x4E3B;&#x8981;&#x7531;3&#x90E8;&#x5206;&#x7EC4;&#x6210;&#xFF1A;&#x7ED3;&#x6784;&#xFF0C;&#x8868;&#x73B0;&#xFF0C;&#x548C;&#x884C;&#x4E3A;
&#x7ED3;&#x6784;&#x5316;&#x6807;&#x51C6;&#x8BED;&#x8A00;&#x4E3B;&#x8981;&#x5305;&#x62EC;XHTML&#x548C;XML&#xFF0C;&#x8868;&#x73B0;&#x6807;&#x51C6;&#x8BED;&#x8A00;&#x4E3B;&#x8981;&#x5305;&#x62EC;CSS,&#x884C;&#x4E3A;&#x6807;&#x51C6;&#x4E3B;&#x8981;&#x5305;&#x62EC;&#x5BF9;&#x8C61;&#x6A21;&#x578B;&#xFF08;&#x5982;W3C DOM&#xFF09;,ECMAScript&#x7B49;
&#x8F6C;&#x4E49;&#x5B57;&#x7B26; \      \t,   \n,   \. ,  \\

4.&#x722C;&#x866B;&#x5B9E;&#x6218;
r.content &#x8FD4;&#x56DE;&#x7684;&#x662F;&#x5B57;&#x8282;&#x5F62;&#x5F0F;,r.text&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x6587;&#x672C;&#x5F62;&#x5F0F;&#xFF0C;r.encoding&#x8FD4;&#x56DE;&#x7684;&#x662F;http&#x5934;&#x731C;&#x6D4B;&#x7684;&#x7F51;&#x9875;&#x7F16;&#x7801;&#x683C;&#x5F0F;
Requests&#x63D0;&#x4F9B;&#x4E86;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x8BBE;&#x7F6E;&#x7F16;&#x7801;&#x683C;&#x5F0F;&#xFF0C;r.encoding=utf-8&#x8BBE;&#x7F6E;&#x6210;UTF-8&#x4E4B;&#x540E;&#xFF0C;&#x201C;new text-->&#x201D;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0;&#x4E71;&#x7801;&#x3002;
         &#x4F46;&#x662F;&#x8FD9;&#x79CD;&#x624B;&#x52A8;&#x7684;&#x65B9;&#x5F0F;&#x7565;&#x663E;&#x7B28;&#x62D9;&#xFF0C;&#x4E0B;&#x9762;&#x63D0;&#x4F9B;&#x4E00;&#x79CD;&#x66F4;&#x52A0;&#x7B80;&#x4FBF;&#x7684;&#x65B9;&#x5F0F;: chardet&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x4F18;&#x79C0;&#x7684;&#x5B57;&#x7B26;&#x4E32;/&#x6587;&#x4EF6;&#x7F16;&#x7801;&#x68C0;&#x6D4B;&#x6A21;&#x5757;&#x3002;&#x5B89;&#x88C5;&#x65B9;&#x5F0F;&#x5982;&#x4E0B;:
         pip install chardet &#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x4F7F;&#x7528;chardet.detect()&#x8FD4;&#x56DE;&#x5B57;&#x5178;&#xFF0C;&#x5176;&#x4E2D; confidence&#x662F;&#x68C0;&#x6D4B;&#x7CBE;&#x786E;&#x5EA6;&#xFF0C;encoding&#x662F;&#x7F16;&#x7801;&#x5F62;&#x5F0F;&#x3002;
         &#x793A;&#x4F8B;&#x5982;&#x4E0B;: import requests
                    r = requests.get('http://www.baidu.com')
                    print chardet.detect(r.content)
                    r.encoding = chardet.detect(r.content)['encoding ']
                    print(r.text)
        &#x76F4;&#x63A5;&#x5C06;chardet &#x63A2;&#x6D4B;&#x5230;&#x7684;&#x7F16;&#x7801;&#xFF0C;&#x8D4B;&#x7ED9;r.encoding&#x5B9E;&#x73B0;&#x89E3;&#x7801;&#xFF0C;r.text&#x8F93;&#x51FA;&#x5C31;&#x4E0D;&#x4F1A;&#x6709;&#x4E71;&#x7801;&#x4E86;&#x3002;&#x9664;&#x4E86;&#x4E0A;&#x9762;&#x90A3;&#x79CD;&#x76F4;&#x63A5;&#x83B7;&#x53D6;&#x5168;&#x90E8;&#x54CD;&#x5E94;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x8FD8;&#x6709;&#x4E00;&#x79CD;&#x6D41;&#x6A21;&#x5F0F;&#xFF0C;&#x793A;&#x4F8B;&#x5982;&#x4E0B;:
                import requests
                r = requests.get('http://www.baidu.com',stream=True)
                print(r.raw.read(10)
        &#x8BBE;&#x7F6E;stream=True&#x6807;&#x5FD7;&#x4F4D;,&#x4F7F;&#x54CD;&#x5E94;&#x4EE5;&#x5B57;&#x8282;&#x6D41;&#x65B9;&#x5F0F;&#x8FDB;&#x884C;&#x8BFB;&#x53D6;, r.raw.read &#x51FD;&#x6570;&#x6307;&#x5B9A;&#x8BFB;&#x53D6;&#x7684;&#x5B57;&#x8282;&#x6570;&#x3002;
chrome + chromedriver

&#x628A;chromedriver&#x653E;&#x5728;chrome&#x540C;&#x7EA7;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x5E76;&#x5411;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x6DFB;&#x52A0;chromedriver&#x8DEF;&#x5F84;

http://npm.taobao.org/mirrors/chromedriver/ &#x4E0B;&#x8F7D;&#x5730;&#x5740;

from selenium import webdriver

driver = webdriver.Chrome()    # &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6D4F;&#x89C8;&#x5668;&#x9A71;&#x52A8;&#x5BF9;&#x8C61;

driver&#x7684;&#x65B9;&#x6CD5;
1. .get("xxx")                     &#x65B9;&#x6CD5;&#x8FDB;&#x5165;&#x7F51;&#x9875;
2. .close()                        &#x5173;&#x95ED;&#x7A97;&#x53E3;
3. .implicitly_wait(n)             &#x9690;&#x5F0F;&#x7B49;&#x5F85;n&#x79D2;
4. .find_element_by_id("Xxxx")     &#x83B7;&#x53D6;&#x5143;&#x7D20;&#x4FE1;&#x606F;
5. .page_source                    &#x83B7;&#x53D6;&#x7F51;&#x9875;&#x6E90;&#x7801;
6. .execute_script('window.scrollTo(0,document.body.scrollHeight)')
7. document.documentElement.scrollTop = document.documentElement.scrollHeight * %f

element = driver.find_element_by_id("xxx")        &#x83B7;&#x53D6;&#x8868;&#x5355;&#x6846;&#x622A;&#x56FE;
element.screenshot(filename)

y_element = driver.find_element_by_id('xxx')      &#x83B7;&#x53D6;&#x9A8C;&#x8BC1;&#x7801;&#x622A;&#x56FE;
y_element.location['x/y']
y_element.size['x/y']

1.click()                                         &#x70B9;&#x51FB;
2.send_keys('xxxx')                               &#x8F93;&#x5165;&#x4FE1;&#x606F;

find_element_by_id
find_element_by_name
find_element_by_xpath                             &#x4F7F;&#x7528;xpath&#x8BFB;&#x6CD5;&#x8FDB;&#x884C;&#x83B7;&#x53D6;
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector                      &#x4F7F;&#x7528;css&#x9009;&#x62E9;&#x5668;&#x83B7;&#x53D6;&#x6570;&#x636E;

find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#xFF1A;
1..text&#x65B9;&#x6CD5;               &#x83B7;&#x53D6;&#x6587;&#x672C;&#x4FE1;&#x606F;&#xFF08;xpath&#x662F;&#x5728;&#x8DEF;&#x5F84;&#x540E;&#x52A0;/text()&#xFF09;
2..get_attribute('xxx')  &#x83B7;&#x53D6;&#x6807;&#x7B7E;&#x5C5E;&#x6027;
3. &#x53EA;&#x6709;find_elements&#x83B7;&#x53D6;&#x7684;&#x7ED3;&#x679C;&#x624D;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x8FED;&#x4EE3;&#x3002;
&#x65B0;&#x7248;&#x672C;&#x7684;&#x9009;&#x62E9;&#x5668;

from selenium.webdriver.common.by import By

div_list = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/div")

driver.find_element(By.NAME, "NAME")
driver.find_element(By.CLASS_NAME, "CLASS_NAME")
driver.find_element(By.ID, "ID")
driver.find_element(By.XPATH, "XPATH")

driver.find_elements(By.XPATH, "XPATH")

&#x4F8B;4&#xFF1A;&#x722C;&#x53D6;&#x82F1;&#x96C4;&#x8054;&#x76DF;&#x7684;&#x56FE;&#x7247; -- selenium&#x6A21;&#x62DF;&#x6D4F;&#x89C8;&#x5668;+ssl&#x8BC1;&#x4E66;
-*- coding:utf-8 -*-
import os
from urllib import request
from selenium import webdriver
import ssl          # &#x8BC1;&#x4E66;
import time

'''
&#x7F51;&#x7AD9;&#x4E32;&#xFF1A;http &#x76F8;&#x5BF9;&#x4E0D;&#x5B89;&#x5168;&#x7684;&#x7F51;&#x7AD9;
       https &#x76F8;&#x5BF9;&#x5B89;&#x5168;&#xFF0C;&#x9700;&#x8981;&#x8BC1;&#x4E66;&#x652F;&#x9A8C;&#x8BC1;&#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x5408;&#x683C;
'''
ssl._create_default_https_context = ssl._create_unverified_context

def download_dir():
    if not os.path.exists('./&#x76AE;&#x80A4;/'):
        os.mkdir('./&#x76AE;&#x80A4;/')

def get_images():
    hero = []
    # &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6D4F;&#x89C8;&#x5668;&#x9A71;&#x52A8;&#x5BF9;&#x8C61;
    driver = webdriver.Chrome()
    driver.get('https://lol.qq.com/data/info-heros.shtml')
    time.sleep(1)
    driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    infos = driver.find_element_by_id('jSearchHeroDiv')
    links = infos.find_elements_by_css_selector('li>a')
    for link in links:
        urls = link.get_attribute('href')
        hero.append(urls.split())
    for i in range(len(hero)):
        driver.get(hero[i][0])
        time.sleep(2)

        # &#x63A7;&#x5236;&#x6D4F;&#x89C8;&#x5668;&#x4E0B;&#x6ED1;&#x5230;&#x6307;&#x5B9A;&#x4F4D;&#x7F6E;
        driver.execute_script('window.scrollTo(100,800)')
        time.sleep(0.5)
        driver.find_element_by_css_selector('#skinNAV').find_elements_by_css_selector('li a')[1].click()
        skins = driver.find_element_by_css_selector('#skinBG').find_elements_by_css_selector('li')

        for i,skin in enumerate(skins):
            img_title = skin.get_attribute('title')
            img_url = skin.find_element_by_css_selector('img').get_attribute('src')
            print(img_url,img_title)
            try:
                request.urlretrieve (img_url, './&#x76AE;&#x80A4;/' + img_title + '.jpg')
                print(f'{img_title}&#x4FDD;&#x5B58;&#x6210;&#x529F;')
            except Exception:
                print('&#x4FDD;&#x5B58;&#x5931;&#x8D25;')
                pass

if __name__=='__main__':
    download_dir()
    get_images()

&#x4F8B;7&#xFF1A;&#x722C;&#x53D6;&#x77ED;&#x79DF;&#x5C0F;&#x732A;&#x7684;&#x6240;&#x6709;&#x7F51;&#x9875;&#x7684;&#x623F;&#x79DF;&#x4FE1;&#x606F;&#xFF08;chomedriver&#x6A21;&#x62DF;&#x4EBA;&#x5DE5;&#x64CD;&#x4F5C;&#xFF0C;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x7684;&#x63D0;&#x53D6;&#xFF09;
from selenium import webdriver
import time

def down_data(info,price,content,score,img1,img2,num):      # &#x4FDD;&#x5B58;&#x6570;&#x636E;
    fp = open('c://Users/Icy-yun/Desktop/&#x77ED;&#x79DF;&#x5C0F;&#x732A;.txt','a+')
    try:
        fp.write('='*5 + info + '='*5 + '\n')           # &#x9632;&#x6B62;&#x51FA;&#x73B0;&#x5F02;&#x5E38;
    except:
        fp.write('&#x540D;&#x5B57;&#x6709;&#x8BEF;&#xFF01;'+'\n')
        print('&#x540D;&#x5B57;&#x6709;&#x8BEF;&#xFF01;'+info)
    fp.write('&#x73AF;&#x5883;&#xFF1A;'+content + '\n')
    fp.write('&#x4EF7;&#x683C;&#xFF1A;'+price)
    fp.write('    &#x8BC4;&#x5206;&#xFF1A;' + score + '\n')
    try:
        fp.write('&#x5C45;&#x4F4F;&#x73AF;&#x5883;&#x56FE;&#x7247;url&#xFF1A;')
        fp.write(img1+'\n')
        fp.write('&#x623F;&#x4E1C;&#x56FE;&#x7247;url&#xFF1A;')
        fp.write(img2+'\n')
    except:
        fp.write('&#x65E0;'+'\n')
        print('&#x7F3A;&#x5C11;url')
    fp.write(f'------------{num}------------\n')
    fp.close()

def next_page():                      # &#x5BF9;python&#x4FE1;&#x606F;&#x8FDB;&#x884C;&#x7FFB;&#x9875;
    num = 1
    while num<=13: # 进行翻页 driver.get(f'https: bj.xiaozhu.com search-duanzufang-p{num}-0 ') 经过裁剪后的url driver.implicitly_wait(10) 隐式等待10s,可以根据网页的加载速度而减少时间,超时会出现异常 drop_down() 调用下拉滑块函数 get_product() # 调用信息采集函数 print('="*10,f" 第{num}页信息已经采集完毕','="*10," \n') num +="1" def drop_down(): 下拉滑块 for x in range(1,11,2): time.sleep(0.5) j="x/10" 按照百分比拉动滑块 js="document.documentElement.scrollTop  =  document.documentElement.scrollHeight * %f" %j driver.execute_script(js) get_product(): 信息采集 lis="driver.find_elements_by_xpath('//ul[@class="pic_list" clearfix list_code"] li') 注意联系每行的第一个元素 li lis: info="li.find_element_by_xpath('.//div/div/a/span[@class="result_title" hiddentxt"]').text price="li.find_element_by_xpath" ('. div span[@class="result_price" ]').text content="li.find_element_by_xpath('.//div/div/em[@class="hiddenTxt"]').text.split('-')[0]" score="li.find_element_by_xpath('.//div/div/em[@class="hiddenTxt"]').text.split('-')[1]" img1="li.find_element_by_xpath('.//a/img[@class="lodgeunitpic"]').get_attribute('src')" img2="li.find_element_by_xpath('.//div/span/a/img[@class="landlordimage"]').get_attribute('src')" print (info,price,content,score,img1,img2) down_data(info,price,content,score,img1,img2,num) print(f'--已经保存第{num}条数据!') if __name__="=" '__main__': 主程序 driver="webdriver.Chrome()" driver.get('https: 正在浏览网页数据','="*5)
    next_page()
    print(" ='*5,'数据已经保存','="*5)
</code></pre><pre><code># &#x4F8B;1&#xFF1A;qq&#x97F3;&#x4E50;&#x6536;&#x85CF;&#x6B4C;&#x66F2; + &#x5404;&#x79CD;&#x89E3;&#x6790;&#x65B9;&#x6CD5;
-*- coding:utf-8 -*-
import requests
import re
from lxml import etree
import parsel
from bs4 import BeautifulSoup

headers = {
    " cookie': 'pgv_pvid="7816360320;" ts_refer="www.baidu.com/link;" ts_uid="715288657;" rk="AWrVxhWv2R;" ptcz="aeecf60024480f5a2f998c86865e2219e42d1eee4bdf52dbdd462e7e007503db;" euin="ow-l7wEl7e6P7z**;" psrf_qqunionid=";" psrf_qqrefresh_token="5C7BA00E03C8600F9563367642F26A40;" psrf_qqaccess_token="1909A64E8D690EDFC1CF55080A9464C8;" psrf_qqopenid="1D90998FC112B52BE4601A83300E63B2;" tmelogintype="2;" uin="2276974147;" yq_index="0;" yqq_stat="0;" pgv_info="ssid=s6073666250;" useraction="1;" _qpsvr_localtk="0.640678577047278;" psrf_access_token_expiresat="1621301506;" psrf_musickey_createtime="1613525506;" qm_keyst="Q_H_L_28WSi060eei8rmEz-RPuZsZ90y9-EJrOT0dnjTgeUfKItbC3Aelz9aiUVS287U1;" qqmusic_key="Q_H_L_28WSi060eei8rmEz-RPuZsZ90y9-EJrOT0dnjTgeUfKItbC3Aelz9aiUVS287U1;" ts_last="y.qq.com/portal/profile.html'," 'origin': 'https: y.qq.com', 'referer': y.qq.com ', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-site', 'user-agent': 'mozilla 5.0 (windows nt 10.0; win64; x64) applewebkit 537.36 (khtml, like gecko) chrome 86.0.4240.111 safari 537.36', } param="{" 'dirid': '201', 'dirinfo': '1', 'g_tk_new_20200303': '28041333', 'g_tk': 'loginuin': '2276974147', 'hostuin': '0', 'format': 'json', 'incharset': 'utf8', 'outcharset': 'utf-8', 'notice': 'platform': 'yqq.json', 'neednewcode': header="{" 537.36' url="https://c.y.qq.com/splcloud/fcgi-bin/fcg_musiclist_getmyfav.fcg?dirid=201&dirinfo=1&g_tk_new_20200303=28041333&g_tk=28041333&loginUin=2276974147&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0" res="requests.get(url=url,headers=headers)" html="res.json()" https: n yqq song 002nkern2lnvi4.html print(html) music_ids="html['mapmid']" music_urls="[f'https://y.qq.com/n/yqq/song/{id}.html'" id music_ids] i,music_url enumerate(music_urls): print(f'第{i+1}首歌曲url:',music_url) try: music_res="requests.get(music_url,headers=header)" music_res.encoding="utf-8" 一、re模块,正则表达式 music_name="re.findall('"songtype":0,"songname":"(.*?)","songtitle":',music_res.text)[0]" singer_name="re.findall('"mid":".*?","singername":"(.*?)","singerid"',music_res.text)[0]" 功能可能需要加上re.s 二、lxml模块(xpath语法,selector语法) lxml模块 xpath语法 路径加上@xxx 或者text() 另一种xpath语法是在末尾加上.text selector="parsel.Selector(music_res.text)" h1::attr(title)').extract()[0] parsel模块,css语法 路径加上::attr 或者::text 末尾需要加入.extract()或者.getall()方法 三、beautifulsoup.bs4模块 find返回第一个标签,find_all返回一个列表,包含所有标签 find和find_all 有.get('xxx')方法 .get_text('xxx')方法 .text方法 soup="BeautifulSoup(music_res.text,'lxml')" html.parser或者'lxml' .printtify()格式化打印 select有.get_text()方法 print(soup.title) soup.title.string 获得标题 soup.title获得标题标签(文本加标签<>&#xFF09;
        # print(soup.a['href'])                     # soup.a['href']              &#x83B7;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;a&#x6807;&#x7B7E;&#x7684;href&#x5C5E;&#x6027;
        # print(soup.find('a').get('href'))         # soup.find('a').get('href')  &#x83B7;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;a&#x6807;&#x7B7E;&#x7684;href&#x5C5E;&#x6027;

        # print(soup.find_all('a'))                 #  find_all['a']   &#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x6240;&#x6709;a&#x6807;&#x7B7E;&#xFF0C;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5217;&#x8868;&#x3002;
        # for s in soup.find_all('a'):              #  .get('href')    &#x53EF;&#x4EE5;&#x83B7;&#x53D6;a&#x6807;&#x7B7E;&#x4E0B;&#x7684;href&#x5C5E;&#x6027;
        #     print(s.get_text('href'))             #  .get_text('href')&#x53EF;&#x4EE5;&#x83B7;&#x53D6;a&#x6807;&#x7B7E;href&#x5C5E;&#x6027;&#x6240;&#x5728;&#x884C;&#x7684;&#x6587;&#x672C;&#x5185;&#x5BB9;
        #     print(s.text)                         #  .text           &#x53EF;&#x4EE5;&#x83B7;&#x53D6;a&#x6807;&#x7B7E;&#x4E0B;&#x7684;&#x6587;&#x672C;&#x5185;&#x5BB9;

        soup1 = soup.find('div',class_="data__cont")
        music_name1 = soup1.find('div',class_='data__name').text.strip('\n')
        # &#x8FD9;&#x4E2A;&#x6807;&#x7B7E;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6587;&#x672C;&#x4FE1;&#x606F;
        # music_name2 = soup1.find('div',class_='data__name').find('h1').text
        # music_name3 = soup1.find('div',class_='data__name').find('h1').get('title')
        # get_text('title')&#x4E5F;&#x53EF;&#x4EE5;
        singer_name = soup1.find('div',class_='data__singer').get('title').replace(' / ','/')
        print(singer_name + '-' + music_name1)

    except:
        print('error')
        pass

</=13:>
scrapy Engine     scrapy&#x6846;&#x67B6;
spider            &#x8718;&#x86DB;&#xFF08;&#x722C;&#x866B;&#xFF09;
ItemPipleline     &#x9879;&#x76EE;&#x7BA1;&#x9053;
Downloader        &#x4E0B;&#x8F7D;&#x5668;
Scheduler         &#x8C03;&#x5EA6;&#x7A0B;&#x5E8F;
&#x5B57;&#x5178;&#x751F;&#x6210;&#x5F0F;&#xFF1A;
dict = {item:price    for  item,price    in  zip(items,prices)}
def func(*args){   }           &#x53EF;&#x53D8;&#x53C2;&#x6570;&#xFF0C;args&#x53D8;&#x6210;&#x4E00;&#x4E2A;&#x5143;&#x7EC4;, func(1,2&#xFF09;
def func(**dicts){   }         &#x6309;&#x952E;&#x503C;&#x4F20;&#x5165;&#x5B9E;&#x53C2;&#xFF0C;dicts&#x662F;&#x4E00;&#x4E2A;&#x5B57;&#x5178;&#x3002;func(a=1,b=2&#xFF09;


scrapy                          &#x5C55;&#x793A;&#x6240;&#x6709;scrapy&#x6846;&#x67B6;&#x547D;&#x4EE4;
scrapy bench                    &#x6D4B;&#x8BD5;scrapy
exit()                          &#x9000;&#x51FA;&#x7F16;&#x8F91;&#x5668;
scrapy shell &#x5BF9;&#x5E94;&#x7F51;&#x5740;            &#x9A8C;&#x8BC1;scrapy&#x6846;&#x67B6;&#x722C;&#x866B;&#x7684;xpath&#x8BED;&#x53E5;
&#xFF08;&#x7B2C;&#x4E00;&#xFF1A; title = xpath(....)   &#x7B2C;&#x4E8C;&#xFF1A;  title&#xFF09;

&#x6CE8;&#x610F;&#xFF1A;
1.&#x53EA;&#x6709;&#x5728;&#x9879;&#x76EE;&#x4E0B;&#x7684;&#x201C;scrapy.cfg&#x201D;&#x540C;&#x7EA7;&#xFF0C;&#x624D;&#x53EF;&#x4EE5;&#x6267;&#x884C;&#x6709;&#x6548;&#x7684;&#x547D;&#x4EE4;
2.&#x5982;&#x679C;scrapy&#x6CA1;&#x6709;&#x6DFB;&#x52A0;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#xFF0C; &#x53EF;&#x4EE5;&#x91C7;&#x7528;&#x547D;&#x4EE4;&#x6DFB;&#x52A0;&#x524D;&#x7F00;&#x7684;&#x65B9;&#x6CD5;   python -m scrapy xxxx

1.&#x5EFA;&#x7ACB;&#x722C;&#x866B;&#x9879;&#x76EE;
&#x547D;&#x4EE4;:cd :  c:\scrapy
          scrapy startproject scrapy_demo0

2.&#x5EFA;&#x7ACB;&#x722C;&#x866B;&#x6587;&#x4EF6;
&#x547D;&#x4EE4;&#xFF1A;cd scrapy_demo0
        scrapy genspider demo_spider  quotes.toscrape.com
       (&#x6216;&#x8005;scrapy  genspider -t  basic  demo_spider  "quotes.toscrape.com")
       (&#x6216;&#x8005;scrapy  genspider -t  crawl  demo_spider  "quotes.toscrape.com")

3.&#x8FD0;&#x884C;&#x722C;&#x866B;&#x6587;&#x4EF6;
&#x547D;&#x4EE4;: scrapy crawl demo_spider

在spiders/xxxSpiner文件


1.&#x65B0;&#x5EFA;&#x7684;xiaozhuspider&#x6587;&#x4EF6;&#x91CC;&#x7684;parse&#x662F;&#x9ED8;&#x8BA4;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x7528;&#x4E8E;&#x89E3;&#x6790;&#x8FD4;&#x56DE;&#x7684;&#x7ED3;&#x679C;
2.&#x6BCF;&#x4E2A;xpath&#x8BED;&#x53E5;&#x540E;&#x90FD;&#x8981;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;.extract() &#x6216;.getall()&#xFF0C; &#x7528;&#x4E8E;&#x63D0;&#x53D6;&#x6570;&#x636E;, &#x6CE8;&#x610F;get&#xFF08;&#xFF09;&#x7528;&#x4E8E;&#x63D0;&#x53D6;&#x5355;&#x4E2A;&#x5143;&#x7D20;
3.items &#x9879;&#x76EE;&#x4E2D; &#x628A;&#x9700;&#x8981;&#x83B7;&#x53D6;&#x7684;&#x9879;&#x76EE;&#x4FE1;&#x606F; &#x5199;&#x5728;items&#x7684;&#x9ED8;&#x8BA4;&#x51FD;&#x6570;&#x91CC; name=scrapy.Field()
4.xxSpider&#x722C;&#x866B;&#x6587;&#x4EF6;&#x4E2D;&#x5F15;&#x5165;items&#x9879;&#x76EE;&#x6587;&#x4EF6;   from ..items import DouyuItem     (..&#x8868;&#x793A;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;&#x4E0A;&#x4E00;&#x7EA7;&#x76EE;&#x5F55;)

&#xFF08;1&#xFF09;&#x3001;&#x521D;&#x59CB;&#x5316;&#x722C;&#x866B;&#x6570;&#x636E;
&#x7C7B;&#x7684;&#x6210;&#x5458;   start_urls &#x5217;&#x8868; &#x3001;base_url &#x6709;&#x5173;url&#x53C2;&#x6570; &#x3001;offset  &#x53C2;&#x6570;&#x3001;&#x81EA;&#x5B9A;&#x4E49;&#x6210;&#x5458;urls
&#x7C7B;&#x7684;&#x65B9;&#x6CD5;  parse(self, response)
&#x521D;&#x59CB;&#x5316;&#x5C5E;&#x6027;&#x503C;&#xFF1A;
start_urls = [base_url+str(offset)]
start_urls = [f'https://ys.mihoyo.com/main/character/{page}?char=0' for page in ('mondstadt','liyue')]
start_urls = [f'https://ys.mihoyo.com/main/character/{page}?char=0' for page in urls]

&#xFF08;2&#xFF09;&#x3001;&#x89E3;&#x6790;&#x6570;&#x636E;
json&#x683C;&#x5F0F;&#x7684;&#x6570;&#x636E;  data_list=json.loads(response.body)['data']

xpath&#x8BED;&#x6CD5;      picture_urls = response.xpath ('//ul[@class="list-group"]/li/div/div/a/img/@data-original').extract()    (&#x4E0D;&#x9700;&#x8981;&#x4F7F;&#x7528; html=etree.HTML(res.text))

re &#x6A21;&#x5757;        titles = re.findall ('{title:"(.*?)",icon', response.text)

&#xFF08;3&#xFF09;&#x3001;&#x5F80;items&#x6587;&#x4EF6;&#x5199;&#x5165;&#x6570;&#x636E;
def parse(self,response):
     for data in data_list:
         item=DouyuItem()
         item['name']=data['nickname'].encode('utf-8')
         item['vertical_src']=data['vertical_src']
         yield item
         &#x6216;&#x8005;
         for div in divs:
             title=div.xpath('./div/p[1]/a/text()').get()
             title_url=div.xpath('./div/p[1]/a/@href').get()
             info=div.xpath('./div/p[2]/a/text()').get()
             img_url=div.xpath('./a/img/@src').get()
             item = QdEnglishItem(title=title,title_url=title_url,info=info,img_url=img_url)
             yield item

&#xFF08;4&#xFF09;&#x3001;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;parse&#x51FD;&#x6570;&#x4E2D;&#x8FDB;&#x884C;&#x7FFB;&#x9875;&#x64CD;&#x4F5C;
def parse(self,response):
    self.offset += 20   #&#x7FFB;&#x9875;
    url = self.base_url+str(self.offset)
    yield scrapy.Request(url,callback=self.parse,dont_filter=True)
 0.pipelines&#x7BA1;&#x9053;&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;&#x4E2D;&#x5F15;&#x5165; &#x6587;&#x4EF6;&#x6A21;&#x5757; imort os
 1.&#xFF08;&#x548C; &#x56FE;&#x7247;&#x6A21;&#x5757;from scrapy.pipelines.images import ImagesPipeline&#xFF09;&#xFF08;&#x6216;&#x8005;import csv&#xFF09;
 2. &#x8BE5;&#x6587;&#x4EF6;&#x4E0D;&#x7528;&#x5F15;&#x5165;items&#x9879;&#x76EE;&#xFF0C;&#x9ED8;&#x8BA4;&#x4F7F;&#x7528;items&#x91CC;&#x9762;&#x7684;&#x6570;&#x636E;

(1)&#x3001;&#x7C7B;&#x7684;&#x6210;&#x5458;  &#x81EA;&#x5B9A;&#x4E49;&#xFF08;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;item['xxx'],&#x4E0D;&#x7528;&#x5F15;&#x5165;&#x6A21;&#x5757;&#xFF09;
        &#x7C7B;&#x7684;&#x65B9;&#x6CD5;  process_item(self, item, spider)&#xFF0C;
                 item_completed(self,result,item,info)
                 __init__(self)
                 close_file(self)

(2)&#x3001;&#x83B7;&#x53D6;&#x6BCF;&#x5F20;&#x56FE;&#x7247;&#x4FE1;&#x606F;
  def get_media_requests(self, item, info):
      image_link=item['vertical_src']
      yield scrapy.Request(image_link)             # &#x8FD9;&#x91CC;&#x56E0;&#x4E3A;&#x9700;&#x8981;&#x518D;&#x6B21;&#x83B7;&#x53D6;&#x56FE;&#x7247;&#x4FE1;&#x606F;

(3)&#x3001;&#x521D;&#x59CB;&#x5316;
     def __init__(self):
         self.f=open('data.csv',mode='a',encoding='utf-8',newline='')
         self.csv_write=csv.DictWriter(self.f,fieldnames=['title','title_url','info','img_url'])
                     self.csv_write.writeheader()

(4)&#x3001;&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;
  def item_completed(self, result, item, info):
      path='C:/Users/Icy-yun/Desktop/douyu/'
      f result[0][0]==True:
      os.rename(path+result[0][1]['path'],path+str((item['name']).decode()+'.jpg'))
      return item
  &#x6216;&#x8005;
  def process_item(self, item, spider):
      self.csv_write.writerow(dict(item))# item&#x662F;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x5B57;&#x5178;
      return item
  def close_file(self):
      self.f.close()

settings&#x8BBE;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;
(1).&#x628A;setting&#x6587;&#x4EF6;&#x5939;&#x91CC;&#x9762;&#x7684;robots&#x534F;&#x8BAE;&#x4FEE;&#x6539;&#x4E00;&#x4E0B;&#xFF0C;ROBOTSTXT_OBEY = False
(2).&#x4F7F;&#x7528;&#x4E86;&#x7BA1;&#x9053;&#x4E0B;&#x8F7D;&#x9700;&#x8981;&#x6253;&#x5F00;
    ITEM_PIPELINES = {
        'douyu.pipelines.DouyuPipeline': 300,
    }
(3).&#x5982;&#x679C;&#x6570;&#x636E;&#x592A;&#x591A;&#x53EF;&#x4EE5;&#x8C03;&#x6574;&#x4E0B;&#x8F7D;&#x5EF6;&#x8FDF;&#x65F6;&#x95F4;DOWNLOAD_DELAY = 3
(4).&#x5982;&#x679C;&#x9700;&#x8981;&#x722C;&#x866B;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x8FD0;&#x884C;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0;&#x8BF7;&#x6C42;&#x5934;
    DEFAULT_REQUEST_HEADERS = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
    }

1.&#x6570;&#x636E;&#x5E93;&#x8BBE;&#x8BA1;&#x4E3A;utf-8&#x7684;&#x5B57;&#x7B26;&#x96C6; &#x3001; utf8_general_ci&#x7684;&#x6392;&#x5E8F;&#x89C4;&#x5219;
2.&#x8BBE;&#x8BA1;&#x8868;&#x65F6;&#x6CE8;&#x610F;&#x4E3B;&#x952E;&#x552F;&#x4E00;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x51FA;&#x73B0;&#x6570;&#x636E;&#x65E0;&#x6CD5;&#x63D2;&#x5165;&#x7684;&#x60C5;&#x51B5;&#xFF08;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0D;&#x8BBE;&#x7F6E;&#x4E3B;&#x952E;&#xFF09;
3.&#x7F16;&#x5199;&#x4EE3;&#x7801;&#x65F6;&#x4E00;&#x5B9A;&#x8981;&#x6CE8;&#x610F;charset = 'utf8'  &#x6CA1;&#x6709;&#x2018;-&#x2019;

Esc&#x952E;                   &#x5B9A;&#x4F4D;&#x5230;&#x6700;&#x540E;&#x4E00;&#x884C;
Ctrl + C                &#x505C;&#x6B62;&#x722C;&#x53D6;

1.pipelines&#x7BA1;&#x9053;&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;&#xFF0C;&#x5F15;&#x5165;pymysql&#x6A21;&#x5757;
    def process_item(self, item, spider):
       # 1.&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#xFF0C;utf8&#x7F16;&#x7801;
       conn = pymysql.connect(host="127.0.0.1",user="root",passwd="xxx",db="dangdang",charset="utf8")
       # 2.&#x62FF;&#x5230;&#x6E38;&#x6807;
       cursor = conn.cursor ()
       for title,link,comment in zip(item["title"],item["link"],item["comment"]):
           sql = "insert into books(title,link,comment) values(%s,%s,%s)"
           #&#x3000;3.&#x6267;&#x884C;SQL&#x8BED;&#x53E5;
           cursor.execute(sql,(title,link,comment))
           # 4.&#x5411;&#x6570;&#x636E;&#x5E93;&#x63D0;&#x4EA4;
           conn.commit()
       #  5.&#x5173;&#x95ED;&#x6E38;&#x6807;&#xFF0C;&#x6570;&#x636E;&#x5E93;
       cursor.close()
       conn.close()
       return item

scrapy_demo0/scrapy_demo0/items定义变量文件

import scrapy

class ScrapyDemo0Item(scrapy.Item):
    # define the fields for your item here like:
    content = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()

scrapy_demo0/scrapy_demo0/pipelines管道下载文件

import os

class ScrapyDemo0Pipeline:
    def __init__(self):
        self.f=open (os.getcwd () + '/&#x722C;&#x53D6;&#x6570;&#x636E;.txt', 'a+')

    def process_item(self, item, spider):
        self.f.write (f'&#x4F5C;&#x8005;&#xFF1A;{item["author"][0]}\n')
        self.f.write (f'&#x6807;&#x7B7E;&#xFF1A;{item["tags"][0]}\n')
        self.f.write (f'&#x540D;&#x8A00;&#xFF1A;{item["content"][0].strip("&#x201C;").strip("&#x201D;")}\n\n')
        return item

    def close_file(self):
        self.f.close()

scrapy_demo0/scrapy_demo0/settings 配置文件

Scrapy settings for scrapy_demo0 project
#
For simplicity, this file contains only settings considered important or
commonly used. You can find more settings consulting the documentation:
#
    https://docs.scrapy.org/en/latest/topics/settings.html
    https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
    https://docs.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'scrapy_demo0'

SPIDER_MODULES = ['scrapy_demo0.spiders']
NEWSPIDER_MODULE = 'scrapy_demo0.spiders'

Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'scrapy_demo0 (+http://www.yourdomain.com)'

Obey robots.txt rules
ROBOTSTXT_OBEY = False

Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

Configure a delay for requests for the same website (default: 0)
See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

Disable cookies (enabled by default)
#COOKIES_ENABLED = False

Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False

Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
#}

Enable or disable spider middlewares
See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
   'scrapy_demo0.middlewares.ScrapyDemo0SpiderMiddleware': 543,
#}

Enable or disable downloader middlewares
See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
   'scrapy_demo0.middlewares.ScrapyDemo0DownloaderMiddleware': 543,
#}

Enable or disable extensions
See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
   'scrapy.extensions.telnet.TelnetConsole': None,
#}

Configure item pipelines
See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'scrapy_demo0.pipelines.ScrapyDemo0Pipeline': 300,
}

Enable and configure the AutoThrottle extension (disabled by default)
See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
The average number of requests Scrapy should be sending in parallel to
each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False

Enable and configure HTTP caching (disabled by default)
See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

scrapy_demo0/scrapy_demo0/spiders/demo_spider爬虫文件

import scrapy
import os
from ..items import ScrapyDemo0Item

class DemoSpiderSpider(scrapy.Spider):
    name = 'demo_spider'
    allowed_domains = ['toscrape.com']
    start_urls = [
        'http://quotes.toscrape.com'
    ]
    def init(self):
        # &#x5148;&#x6E05;&#x9664;&#x539F;&#x6709;&#x7684;&#x6587;&#x4EF6;;
        if os.path.exists (os.getcwd () + '/&#x722C;&#x53D6;&#x6570;&#x636E;.txt'):
            os.remove (os.getcwd () + '/&#x722C;&#x53D6;&#x6570;&#x636E;.txt')

    def parse(self, response):
        # &#x91C7;&#x7528;scrapy&#x7684;selector&#x65B9;&#x6CD5;&#x89E3;&#x6790;&#x6570;&#x636E;
        for quote in response.css('div.quote'):
            content = quote.css ('span.text::text').extract_first (),
            author = quote.css ('span small::text').extract_first (),
            tags = ','.join(quote.css ('div.tags a.tag::text').extract ()),

            item = ScrapyDemo0Item(content=content,author=author,tags=tags)
            yield item
        next_page = response.css('li.next > a::attr(href)').extract_first()
        print(next_page)
        if next_page:
            yield scrapy.Request(response.urljoin(next_page))

&#x4F8B;3&#xFF1A;&#x722C;&#x53D6;&#x4EE3;&#x7406;&#x7F51;&#x7AD9;--chardet&#x7F16;&#x7801;&#x89E3;&#x6790;&#x5E93;+parsel&#x5E93;xpath&#x8BED;&#x6CD5;+&#x4EE3;&#x7406;&#x68C0;&#x6D4B;
'''
   ### &#x722C;&#x53D6;&#x4E91;&#x4EE3;&#x7406;&#x3001;&#x5FEB;&#x4EE3;&#x7406;&#x7F51;&#x7AD9;&#xFF0C; &#x4EE3;&#x7406;&#x6D4B;&#x8BD5;
'''
import requests
import parsel
import time
import chardet

&#x8BF7;&#x6C42;&#x5934;
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}

&#x4ECE;&#x4EE3;&#x7406;&#x7F51;&#x7AD9;&#x4E2D;&#x89E3;&#x6790;&#x6570;&#x636E;
def parse_page(pre_url,pageCount):
    proxy_list = []
    num = 0
    for page in range(1,pageCount):
        time.sleep(0.5)

        ## &#x62FC;&#x63A5;&#x5B8C;&#x6574;&#x7684;&#x8DEF;&#x5F84;
        url = pre_url+str(page)

        print(f'====&#x6B63;&#x5728;&#x6293;&#x53D6;&#x7B2C;{page}&#x9875;&#x6570;&#x636E;=====')
        # &#x53D1;&#x9001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;
        res = requests.get(url=url,headers=headers)             # <>&#x8868;&#x793A;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;
        print(chardet.detect(res.content))                      # chardet.detect(res.content) &#x53EF;&#x4EE5;&#x68C0;&#x6D4B;&#x7F16;&#x7801;&#x683C;&#x5F0F;
        res.encoding = chardet.detect(res.content)['encoding']  # encoding&#x662F;&#x731C;&#x6D4B;&#x7F16;&#x7801;&#x683C;&#x5F0F;
        # print(res.text)
        # res.encoding = 'gbk'                                  # &#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x8C03;&#x8BD5;&#xFF0C;&#x624D;&#x77E5;&#x9053;&#x662F;&#x5426;&#x7F51;&#x9875;&#x662F;&#x54EA;&#x4E00;&#x79CD;&#x7F16;&#x7801;&#x7C7B;&#x578B;
        '''
         Requests&#x63D0;&#x4F9B;&#x4E86;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x8BBE;&#x7F6E;&#x7F16;&#x7801;&#x683C;&#x5F0F;&#xFF0C;r.encoding=utf-8&#x8BBE;&#x7F6E;&#x6210;UTF-8&#x4E4B;&#x540E;&#xFF0C;&#x201C;new text-->&#x201D;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0;&#x4E71;&#x7801;&#x3002;
         &#x4F46;&#x662F;&#x8FD9;&#x79CD;&#x624B;&#x52A8;&#x7684;&#x65B9;&#x5F0F;&#x7565;&#x663E;&#x7B28;&#x62D9;&#xFF0C;&#x4E0B;&#x9762;&#x63D0;&#x4F9B;&#x4E00;&#x79CD;&#x66F4;&#x52A0;&#x7B80;&#x4FBF;&#x7684;&#x65B9;&#x5F0F;: chardet&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x4F18;&#x79C0;&#x7684;&#x5B57;&#x7B26;&#x4E32;/&#x6587;&#x4EF6;&#x7F16;&#x7801;&#x68C0;&#x6D4B;&#x6A21;&#x5757;&#x3002;&#x5B89;&#x88C5;&#x65B9;&#x5F0F;&#x5982;&#x4E0B;:
         pip install chardet &#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x4F7F;&#x7528;chardet.detect()&#x8FD4;&#x56DE;&#x5B57;&#x5178;&#xFF0C;&#x5176;&#x4E2D; confidence&#x662F;&#x68C0;&#x6D4B;&#x7CBE;&#x786E;&#x5EA6;&#xFF0C;encoding&#x662F;&#x7F16;&#x7801;&#x5F62;&#x5F0F;
        '''
        selector = parsel.Selector(res.text)       #&#x3000;css&#x8BED;&#x6CD5;    # parsel&#x6A21;&#x5757;&#x5C01;&#x88C5;&#x4E86;re&#x3001;lxml&#x3001;css&#x6A21;&#x5757;
        # trs1 = selector.css('table.table-striped tbody tr td:nth-child(1)::text').extract()
        # trs2 = selector.css('table.table-striped tbody tr td:nth-child(2)::text').extract()
        '''
        &#x4F7F;&#x7528;parsel&#x89E3;&#x6790;&#x6A21;&#x5757;&#x89E3;&#x6790;
        css  1.&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x76F8;&#x540C;&#x5C5E;&#x6027;&#x7684;&#x5185;&#x5BB9;&#xFF08;&#x4E00;&#x4E2A;class&#x7684;&#x5C5E;&#x6027;&#x542B;&#x6709;&#x591A;&#x4E2A;&#x540C;&#x7C7B;&#x578B;&#x7684;&#x6570;&#x636E;&#xFF09;,&#x53EA;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;
             2.&#x9009;&#x62E9;&#x6307;&#x5B9A;&#x7684;&#x5B50;&#x8282;&#x70B9;&#x4E5F;&#x9700;&#x8981;&#x4F7F;&#x7528;:nth-child(n)
             3.&#x6700;&#x5F00;&#x59CB;&#x7684;&#x8DEF;&#x5F84;&#x9700;&#x8981;&#x786E;&#x5B9A;&#x54EA;&#x4E00;&#x4E2A;&#x6807;&#x7B7E;
        xpath 1.&#x9700;&#x8981;&#x4F7F;&#x7528;get()&#x6765;&#x83B7;&#x53D6;&#x6570;&#x636E;&#xFF0C;&#x5426;&#x5219;&#x83B7;&#x53D6;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;
        '''
        ## &#x4E24;&#x4E2A;&#x7F51;&#x7AD9;&#x7684;&#x8868;&#x683C;&#x7C7B;&#x4F3C;
        ### &#x4E91;&#x4EE3;&#x7406;&#x7684;&#x5185;&#x5BB9;
        # trs = selector.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')
        ### &#x5FEB;&#x4EE3;&#x7406;&#x7684;&#x5185;&#x5BB9;
        trs = selector.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')

        for tr in trs:
            ip_type = tr.xpath('td[4]/text()').get()
            ip_proxy = tr.xpath('td[1]/text()').get()
            ip_port = tr.xpath('td[2]/text()').get()

            proxies_dict ={
                ip_type: ip_type + "://" + ip_proxy + ":" + ip_port,
            }
            proxy_list.append(proxies_dict)
            print('&#x4FDD;&#x5B58;&#x6210;&#x529F;&#xFF1A;',proxies_dict)
            num += 1
    print('&#x83B7;&#x53D6;&#x5230;&#x7684;&#x4EE3;&#x7406; ip&#x6570;&#x91CF;&#xFF1A;',num)
    print('\n&#x6B63;&#x5728;&#x8FDB;&#x884C;&#x68C0;&#x6D4B;IP')
    check_ip(proxy_list)

&#x68C0;&#x6D4B;IP&#x6216;&#x4F7F;&#x7528;&#x4EE3;&#x7406;IP&#x8BBF;&#x95EE;&#x7F51;&#x7AD9;
def check_ip(proxy_list,isTest=None,t_url=None,t_headers=None,t_params=None):
    ''' &#x68C0;&#x6D4B;&#x4EE3;&#x7406;ip&#x7684;&#x53EF;&#x7528;&#x6027;'''
    c_url = 'http://www.baidu.com/'          ## &#x9ED8;&#x8BA4;&#x4F7F;&#x7528;&#x767E;&#x5EA6;&#x9996;&#x9875;&#x6765;&#x6D4B;&#x8BD5;ip&#x7684;&#x6709;&#x6548;&#x6027;
    c_headers = headers
    use_proxy = []
    if isTest == None or isTest == True:
        print('&#x6B63;&#x5728;&#x68C0;&#x6D4B;IP...')
    else:
        print('&#x6B63;&#x5728;&#x4F7F;&#x7528;&#x4EE3;&#x7406;IP&#x8BBF;&#x95EE;&#x7F51;&#x9875;...')

    if t_url != None:            ## &#x5916;&#x90E8;url
        c_url = t_url
    if t_headers != None:        ## &#x5916;&#x90E8;headers
        c_headers = t_headers
    for ip in proxy_list:                           # data ,param                 ### proxies&#x503C;&#x5E94;&#x8BE5;&#x662F;&#x4E00;&#x4E2A;&#x5B57;&#x5178;
        try:                                                                      ### proxies = {'http':'http://123.456.75:00'}
            if isTest == None or isTest == True:                ### &#x6D4B;&#x8BD5;IP&#x6709;&#x6548;&#x6027;
                ip_res = requests.get(url=c_url,headers=c_headers,proxies=ip,timeout=3)
                if ip_res.status_code == 200:
                    use_proxy.append(ip)
                    print(f'&#x5F53;&#x524D;&#x4EE3;&#x7406;ip&#xFF1A;{ip}&#x5408;&#x683C;')
                time.sleep(0.2)
            else:                                               ### &#x4F7F;&#x7528;&#x4EE3;&#x7406;IP&#x8BBF;&#x95EE;&#x5916;&#x90E8;&#x7F51;&#x9875;,&#x4EE3;&#x7406;IP&#x4E0D;&#x9700;&#x8981;&#x8BF7;&#x6C42;&#x5934;
                res = None
                if t_params == None:
                    res = requests.get(url=c_url,proxies=ip,timeout=3)
                else:
                    res = requests.get(url=c_url,params=t_params,proxies=ip,timeout=3)
                print ('&#x5DF2;&#x7ECF;&#x63D0;&#x53D6;&#x6570;&#x636E;')
                try:
                    code1 = chardet.detect (res.content)["encoding"]  ### &#x53CC;&#x91CD;&#x7F16;&#x7801;&#x6765;&#x4FDD;&#x8BC1;&#x7F16;&#x7801;&#x7684;&#x6B63;&#x786E;&#x6027;
                    code2 = res.apparent_encoding  ### &#x4F46;&#x4F9D;&#x7136;&#x6709;&#x5F88;&#x591A;&#x7F51;&#x7AD9;&#x6709;&#x7F16;&#x7801;&#x65B9;&#x9762;&#x7684;&#x9632;&#x5FA1;&#x63AA;&#x65BD;
                    if code1 != None:
                        res.encoding = code1
                    else:
                        if code2 != None:
                            res.encoding = code2
                        else:
                            raise Exception ("chardet&#x5E93;&#x548C;apparent_encoding&#x7F16;&#x7801;&#x90FD;&#x4E3A;None")
                    print (f'&#x5F53;&#x524D;&#x5DF2;&#x7ECF;&#x89E3;&#x7801;{res.encoding}')
                except Exception as e:
                    print (f'&#x5F53;&#x524D;&#x7F16;&#x7801;&#x5DF2;&#x7ECF;&#x8BBE;&#x7F6E;&#x4E3A;&#x9ED8;&#x8BA4;utf8&#x7F16;&#x7801;&#x683C;&#x5F0F;&#xFF0C;{e}')
                    res.encoding = 'utf8'
                    pass
                if res.status_code == 200:
                    print('&#x5F53;&#x524D;&#x7F51;&#x9875;&#x6570;&#x636E;&#x662F;'+res.text)
                else:
                    print('&#x8BF7;&#x6C42;&#x7F51;&#x9875;&#x6570;&#x636E;&#x5931;&#x8D25;&#xFF0C;&#x8BF7;&#x91CD;&#x8BD5;')
        except Exception as e:
            if isTest == None or isTest == True:
                print(f'&#x5F53;&#x524D;&#x4EE3;&#x7406;ip&#xFF1A;{ip}&#x8BF7;&#x6C42;&#x8D85;&#x65F6;&#xFF0C;&#x68C0;&#x6D4B;&#x4E0D;&#x5408;&#x683C;')
            else:
                print(f'&#x5F53;&#x524D;&#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#x4EE3;&#x7406;IP&#x8BBF;&#x95EE;&#x5F53;&#x524D;&#x7F51;&#x9875;{e}')

    if isTest == None or isTest == True:            ## &#x6D4B;&#x8BD5;IP&#x7ED3;&#x679C;
        if len(use_proxy)!=0:
            print('\n&#x6B63;&#x5728;&#x5217;&#x4E3E;&#x53EF;&#x7528;IP:')
            for i,proxy in enumerate(use_proxy):
                print(f'&#x7B2C;{i+1}&#x4E2A;&#x53EF;&#x7528;IP&#xFF1A;{proxy}')
        else:
            print('&#x62B1;&#x6B49;&#xFF01;&#x6240;&#x6709;IP&#x90FD;&#x4E0D;&#x53EF;&#x7528;')
    else:                                       ## &#x4EE3;&#x7406;IP&#x8BBF;&#x95EE;&#x7F51;&#x7AD9;&#x7684;&#x7ED3;&#x679C;
        print('&#x4F7F;&#x7528;&#x4EE3;&#x7406;IP&#x8BBF;&#x95EE;&#x7F51;&#x9875;&#x7ED3;&#x675F;')

if __name__=="__main__":
    #### &#x4E91;&#x4EE3;&#x7406;
    # pre_url = 'http://www.ip3366.net/?stype=1&page='
    # pageCount = 11
    # parse_page(pre_url,pageCount)
    #### &#x5FEB;&#x4EE3;&#x7406;
    # pre_url = 'https://www.kuaidaili.com/free/inha/'
    # pageCount = 11
    # parse_page(pre_url,pageCount)

    #### &#x6D4B;&#x8BD5;&#x4EE3;&#x7406;IP&#x7684;&#x6709;&#x6548;&#x6027;
    proxies_list = []
    proxies_items = {'HTTP': 'HTTP://59.55.164.25:3256'}
    proxies_list.append(proxies_items)
    proxies_items = {'HTTP': 'HTTP://59.55.164.25:3256'}
    proxies_list.append(proxies_items)
    check_ip(proxies_list)

    #### &#x6D4B;&#x8BD5;&#x7F51;&#x9875;&#x4F7F;&#x7528;&#x4EE3;&#x7406;IP
    # t_url = 'https://wallhaven.cc/hot?page=5'        ### &#x8FD9;&#x4E2A;&#x7F51;&#x7AD9;&#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#x6B63;&#x5E38;&#x65B9;&#x5F0F;&#x53BB;&#x83B7;&#x53D6;&#x6B63;&#x786E;&#x7F16;&#x7801;&#x7684;&#x7F51;&#x9875;
    # t_headers = {
    #     'authority': 'wallhaven.cc',
    #     'method': 'GET',
    #     'path': '/hot?page=6',
    #     'scheme': 'https',
    #     'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    #     'accept-encoding': 'gzip, deflate, br',
    #     'accept-language': 'zh-CN,zh;q=0.9',
    #     'cache-control': 'max-age=0',
    #     'cookie': '_pk_id.1.01b8=abe1922f5b6b4dbe.1627432653.; _pk_ses.1.01b8=1; XSRF-TOKEN=eyJpdiI6IjhWYndWZWxXZmkwTTh5RHVZWG4rakE9PSIsInZhbHVlIjoiXC9GZWZBU0cyd3FEd1dKSFZUdHA4bUF1WCtSRkVUcmM0VzJHcWM1QXRaNk11V0pDcFFOUGlXamJlXC9ubXlQODVLIiwibWFjIjoiNDgzNjUwMDlhYjFmN2M3MDQxOTdkYzAzZWUzZDA0NjQzYmUxYzE1NTczOTBhMWQ4MjRmNmQ4NzhjMmIxNzNiOCJ9; wallhaven_session=eyJpdiI6IjM1TnZXQ2ZPV3p5UkNHdUlcL1VQNWlnPT0iLCJ2YWx1ZSI6Ik9UUEk0XC8zcDdhOGNkcWtmOTFBMWtjZWhvN0FxNkVzWjN6TG9MeVV4SzBidE1yb3prVSt4ZytPWjNmZzdRSlJjIiwibWFjIjoiOGI1YWZmZGI3YTdlZjIxYTIyMTFlMzQxNGJjZjRiZGIxZTljYTJlYTcxNzE0MDEwZDg1NDA3OWQ5ZTEwZjk4ZCJ9',
    #     'dnt': '1',
    #     'upgrade-insecure-requests': '1',
    #     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3870.400 QQBrowser/10.8.4405.400',
    # }
    # t_params = {
    #     "page": "6"
    # }
    # check_ip(proxies_list,False,t_url,t_headers,t_params)


&#x5148;&#x767B;&#x5F55;&#xFF0C;&#x540E;&#x83B7;&#x53D6;&#x6570;&#x636E;&#x7684;&#x539F;&#x5219;&#x3002;

# ## &#x767B;&#x5F55;headers
headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Length': '1343',
    'Content-Type': 'application/json;charset=UTF-8',
    # 'Cookie': 'lianjia_uuid=1c467c64-7f14-4cc3-8bb6-7fbfeb0d8e9e; _smt_uid=62ca2925.4765cab8; sajssdk_2015_cross_new_user=1; _ga=GA1.2.1277253011.1657415976; _gid=GA1.2.572250099.1657415976; crosSdkDT2019DeviceId=-51d8ff--5mdcvr-fvmfmboapp9hu55-36vejykpe; lianjia_ssid=b7ade908-94e7-4cd6-933b-a4827c25ed16; select_city=310000; Hm_lvt_9152f8221cb6243a53c83b956842be8a=1657416994; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22181e5b0bcb3351-050ae16361d442-26021a51-1327104-181e5b0bcb421d%22%2C%22%24device_id%22%3A%22181e5b0bcb3351-050ae16361d442-26021a51-1327104-181e5b0bcb421d%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D; Hm_lpvt_9152f8221cb6243a53c83b956842be8a=1657420005; JSESSIONID=81497D8D13D7CF413369F68F49CD7EE7',
    'Host': 'clogin.lianjia.com',
    'Origin': 'https://sh.lianjia.com',
    'Pragma': 'no-cache',
    'Referer': 'https://sh.lianjia.com/',
    'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
}
#
## &#x767B;&#x5F55;data
data = {
    'accountSystem': 'customer',
    'context': {
        'clickPosX': '736',
        'clickPosY': '237',
        'clientSource': 'pc',
        'os': 'Windows',
        'osVersion': '10',
        'registerPosLx': '609.6000366210938',
        'registerPosLy': '223.6999969482422',
        'registerPosRx': '909.6000366210938',
        'registerPosRy': '606.4999847412109',
        'screen': '1519_322',
        'ua': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    },
    'credential':
    {
        'encodeVersion': '1',
        'password': 'PkZWkCivOK2jIJZFw6BAFrFiaPq292iOxAhgQKHTYDulICbqytiEqSPScQf37NNTh/IfENOWHcGKL1YVVmW9iWvBnKLVpJCetRKldZUxSMQ9p0rquJGupY4Wz2ER0rt6S0cJtE96/caIVXeRMtIzyI/K4oCRCZ4t61lyBWldke8=',
        'username': '13228827053',
    },
    'loginTicketId': 'VOldD3P9UMAOnMbZhgNP7Z1skv3BRe5T',
    'mainAuthMethodName': 'username-password',
    'service': 'https://ajax.api.lianjia.com/login/login/getuserinfo',
    'srcId': 'eyJ0Ijoie1wiZGF0YVwiOlwiZGZhOTk2Y2VjOTEyNjI0ZDcyY2ZlZDI4NTBlMDU5ZmYxMTZiY2ExNDJiN2FlYjY5MTIxMWQyZTg0YjNjMmEyMDJiNTIwMDI3Njc3MWU5OGFhMzMyMjg1ZDg0NWZmMWUzNDBhNDIwNmE2NzdjYmMzYmI1YmQ2YjRiMDVlYTYwOWExMjQ1NDE2ZjhjN2ZiZDQ0YjVmZmMxNzMyOWUxOGZmYzk3YjdjOGM4MTRhMDU1YzlkOTdkYzQ5OWE0YjUwZDhjN2I2ODQyZjA4MTlmODI5ZDc0OWI3ZmY0MWVmZGVhOWNjZTM0MjRiNGY4MjUxM2YxYTViNzc1ODc0MTcwZTk3ZVwiLFwia2V5X2lkXCI6XCIxXCIsXCJzaWduXCI6XCIzNTc1OWQwNVwifSIsInIiOiJodHRwczovL3NoLmxpYW5qaWEuY29tLyIsIm9zIjoid2ViIiwidiI6IjAuMSJ9',
    'ticketMaxAge': '604800',
    'version': '2.0',
}
#
# ## &#x767B;&#x5F55;&#x5E10;&#x53F7;
# username='13228827053'
# password='xxxxx'
#
# &#x63D0;&#x4EA4;&#x767B;&#x5F55;&#xFF0C;&#x5E76;&#x4FDD;&#x5B58;&#x767B;&#x5F55;&#x7684;&#x72B6;&#x6001;
session_requests = requests.session()
login_url = 'https://clogin.lianjia.com/authentication/authenticate'
# &#x63D0;&#x4EA4;&#x767B;&#x5F55;&#x8868;&#x5355;
result = session_requests.post(  url=login_url,   data =data, headers = headers1 )
print("&#x5DF2;&#x7ECF;&#x63D0;&#x4EA4;&#x767B;&#x5F55;&#x4FE1;&#x606F;",result)

1.open方法


f = open('c:/Users/Icy-yun/Desktop/www2.txt', 'a+')
get_info(url)
f.write('\n\n----------&#x7B2C;%d&#x7AE0;&#x5DF2;&#x5B8C;&#x7ED3;---------\n\n' %n)
f.close()

2.with方法

photo_data = requests.get(url = photo_url,headers=headers).content

with open(path + photo_name + '('+ str(n+i+1) + ')' + '.jpg',mode='wb') as f:
      f.write(photo_data)
      print(f'&#x7B2C;{n+i+1}&#x5F20;&#x56FE;&#x7247;&#x5DF2;&#x7ECF;&#x4E0B;&#x8F7D;&#x5B8C;&#x6BD5;&#xFF01;')           #    {i+n}&#x65E0;&#x6CD5;&#x4F7F;&#x7528;
  f.close()

3.urllib方法


from urllib import request

&#x56FE;&#x7247;&#x4E0D;&#x662F;.jpg&#x6216;&#x8005;.png&#x7684;&#x94FE;&#x63A5;&#x65E0;&#x6CD5;&#x4FDD;&#x5B58;&#xFF0C;&#x83B7;&#x53D6;&#x7684;photo_url&#x6CA1;&#x6709;cookie&#x7684;&#x6570;&#x636E;&#x4E5F;&#x65E0;&#x6CD5;&#x5728;&#x5176;&#x5B83;&#x6D4F;&#x89C8;&#x5668;&#x6253;&#x5F00;

request.urlretrieve(photo_url,path + photo_name + '('+ str(i+n) + ')'+'.jpg')

4.获取当前路径

 path = os.getcwd() + '/&#x97F3;&#x4E50;'                   # &#x5F53;&#x524D;&#x8DEF;&#x5F84;&#x4E0B;&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5939;
 os.makedirs(path, exist_ok=True)              # &#x4FDD;&#x8BC1;&#x5728;&#x5F53;&#x524D;&#x8DEF;&#x5F84;&#x4E0B;&#x5EFA;&#x7ACB;&#x6587;&#x4EF6;&#x5939;

 path = f'{name}\\'                             # &#x5F53;&#x524D;&#x8DEF;&#x5F84;&#x4E0B;&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5939;
 if not os.path.exists(path):                  # &#x540C;os.makedirs(path,exist_ok=True)
    os.makedirs(path)

 "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)   # join &#x8FDE;&#x63A5;&#x5217;&#x8868;&#x6570;&#x636E;

  pre_data = pre_data if pre_data else  ''                     # &#x4E09;&#x76EE;&#x8FD0;&#x7B97;&#x7B26;&#x6570;&#x636E;

 string = string.strip(xxxx)

 if(string), and , is not, in,   None

 for i,item in enumerate(xxx)                               &#x679A;&#x4E3E;&#x904D;&#x5386;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oO6UjJVr-1661622494545)(C:\Users\Icy-yun\AppData\Roaming\Typora\typora-user-images\image-20220528125954218.png)]

1.open方法

    if os.path.exists(dir):
        f =open(dir,"r")
        data = f.read ()
        print(data)
        f.close ()

2.with 方法

&#xFF08;1.with + for..in  &#x76F4;&#x63A5;&#x8BFB;&#x53D6;&#xFF08;&#x901F;&#x5EA6;&#x5FEB;&#xFF09;
 with open('filepath','r') as f:
    for line in f:
        print&#xFF08;line&#xFF09;
        print('&#x4E00;&#x884C;&#x6570;&#x636E;')

&#xFF08;2.with + read  &#x5168;&#x90E8;&#x8BFB;&#x53D6;&#xFF08;&#x5360;&#x7528;&#x5185;&#x5B58;&#xFF09;
with open('filepath','r') as f:
    ff=f.read()

&#xFF08;3.with + readlines &#x6309;&#x884C;&#x8BFB;&#x53D6;
with open('filepath','r') as f:
    lines =f.readline()
    for line in lines:
        print(line)

(1.csv 模块读写

import urllib,os,csv

csv&#x6587;&#x4EF6;&#x64CD;&#x4F5C;
def openCSV(filename):
    if not os.path.exists('./position'):
        os.mkdir('position')
    fp = open (f'./position/{filename}.csv', 'a+', newline='', encoding='utf-8-sig')
    writer = csv.writer (fp)
    writer.writerow (('&#x7ECF;&#x5EA6;','&#x7EAC;&#x5EA6;','&#x5730;&#x94C1;&#x7AD9;_500m','&#x5730;&#x94C1;&#x7AD9;_1000m','&#x5730;&#x94C1;&#x7AD9;_1500m','&#x5B66;&#x6821;_500m','&#x5B66;&#x6821;_1000m','&#x5B66;&#x6821;_1500m','&#x533B;&#x9662;_500m','&#x533B;&#x9662;_1000m','&#x533B;&#x9662;_1500m','&#x8D2D;&#x7269;&#x4E2D;&#x5FC3;_500m','&#x8D2D;&#x7269;&#x4E2D;&#x5FC3;_1000m','&#x8D2D;&#x7269;&#x4E2D;&#x5FC3;_1500m'
))
    return fp,writer
def writeCSV(writer,*data):
    writer.writerow (tuple(data))
def closeCSV(fp):
    fp.close()

&#x8BFB;&#x53D6;csv&#x6587;&#x4EF6;
def readCSV(dir):
    f = open(dir,encoding='utf8' )
    reader = csv.reader(f)
    for row in reader:
        print(row)

originCSVDir = './123.csv'
readCSV(originCSVDir)

(2.实战事例

&#x4F8B;11&#xFF1A;&#x722C;&#x53D6;&#x8C46;&#x74E3;&#x97F3;&#x4E50;&#x7684;&#x97F3;&#x4E50;&#x6392;&#x884C;&#x699C; --&#x201C;&#x672C;&#x5468;&#x97F3;&#x4E50;&#x4EBA;&#x6700;&#x70ED;&#x5355;&#x66F2;&#x699C;&#x201D;&#x7684;&#x9875;&#x9762;&#x4FE1;&#x606F;&#xFF08;CSV&#x5E93;&#x4FDD;&#x5B58;&#xFF09;
import requests
from lxml import etree
import  re
import csv

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                 '(KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}

print("&#x6B63;&#x5728;&#x52A0;&#x8F7D;&#x7F51;&#x9875;&#x6570;&#x636E;&#x3002;&#x3002;&#x3002;\n")
url = 'https://music.douban.com/chart'
res = requests.get(url,headers=headers)
selector = etree.HTML(res.text)
songs1 = selector.xpath('//*[@id="content"]/div/div[1]/div/ul/li/div/h3/a/text()')
songs2 = selector.xpath('//*[@id="content"]/div/div[1]/div/ul/li/div/p/a/text()')
singers1 = selector.xpath('//*[@id="content"]/div/div[1]/div/ul/li/div/p/text()')
singers2 = selector.xpath('//*[@id="content"]/div/div[1]/div/ul/li/div/p/text()')

xpath&#x521D;&#x59CB;&#x5C31;&#x662F;&#x5927;&#x6807;&#x7B7E;&#x65F6;&#xFF0C;&#x5219;&#x4E0D;&#x7528;&#x66F4;&#x6539;

print("&#x5DF2;&#x52A0;&#x8F7D;&#x5B8C;&#x6BD5;&#xFF01;\n")
print('&#x6B63;&#x5728;&#x4FDD;&#x5B58;&#x6570;&#x636E;&#x3002;&#x3002;&#x3002;')

fp=open('c://Users/Icy-yun/Desktop/www.csv','wt',newline='',encoding='utf-8-sig')
writer = csv.writer(fp)
writer.writerow(('&#x6B4C;&#x540D;','&#x6B4C;&#x624B;','&#x64AD;&#x653E;&#x91CF;'))

n=0
for song,singer in zip(songs1,singers1):
    singer_1=singer.split('/')[0]
    singer_2=singer.split('/')[1]
    print(song,' ',singer_1,' ',singer_2)
    writer.writerow((song,singer_1,singer_2))
    n+=1

for song in songs2:
    n2=0
    for singer2 in singers2:
        if n2<=n: n2+="1" continue result="re.search" (' ', singer2) # 如果这条信息不是需要爬取的信息,则根据search查找':'是否存在 if none: 因为re.search返回的是一个对象,根据是否为none来控制是否退出循环 n+="1" singer2_1="re.sub('\n','',singer2,5)" singer2_2="re.sub('" ','',singer2_1,20) singer_1="singer2_2.split('/')[0]" singer_2="singer2_2.split('/')[1]" print(song,' ',singer_1,' ',singer_2) writer.writerow((song,singer_1,singer_2)) break fp.close() print("已保存数据!") 把得到的csv文件先用记事本打开,然后另存为带有bom的utf-8类型的xxx1.csv文件。可以打开 虽然无法在csv文件里面编辑,但可以复制到excel文件里面,进行编辑,保存的操作 < code></=n:>

注意:数据库的字符编码为utf8

1.使用方法

&#xFF08;1&#xFF09;&#x5BFC;&#x5305;                import pymysql

&#xFF08;2&#xFF09;&#x521B;&#x5EFA;&#x8FDE;&#x63A5;&#x5BF9;&#x8C61;          pymysql.connect(&#x53C2;&#x6570;&#x5217;&#x8868;)
                        conn = connect(host='localhost',port=3306,user='root'
                              ,password='xxxx',database='jing_dong',charset='utf8')

&#xFF08;3&#xFF09;&#x83B7;&#x53D6;&#x6E38;&#x6807;&#x5BF9;&#x8C61;          cursor =conn.cursor()

&#xFF08;4&#xFF09;&#x6267;&#x884C;SQL&#x8BED;&#x53E5;          row_count = cursor.execute(sql)

&#xFF08;5&#xFF09;&#x83B7;&#x53D6;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;&#x96C6;&#xFF08;&#x67E5;&#x8BE2;&#xFF09;                 result = cursor.fetchall()
                                       result = cursor.fetchone()

&#xFF08;6&#xFF09;&#x5C06;&#x4FEE;&#x6539;&#x64CD;&#x4F5C;&#x63D0;&#x4EA4;&#x5230;&#x6570;&#x636E;&#x5E93;(&#x6DFB;&#x52A0;&#xFF0C;&#x4FEE;&#x6539;&#xFF0C;&#x5220;&#x9664;) conn.commit()

&#xFF08;7&#xFF09;&#x56DE;&#x6EDA;&#x6570;&#x636E;             conn.rollback()

&#xFF08;8&#xFF09;&#x5173;&#x95ED;&#x6E38;&#x6807;             cursor.close()

&#xFF08;9&#xFF09;&#x5173;&#x95ED;&#x8FDE;&#x63A5;             conn.close()

2.crud 增删改查


import pymysql

&#x521B;&#x5EFA;&#x8FDE;&#x63A5;&#x5BF9;&#x8C61;
conn = pymysql.connect(host='localhost', port=3306, user='root', password='xxxx',database='python', charset='utf8')

&#x83B7;&#x53D6;&#x6E38;&#x6807;&#x5BF9;&#x8C61;
cursor = conn.cursor()

try:
    # &#x6DFB;&#x52A0; SQL &#x8BED;&#x53E5;
    # sql = "insert into students(name) values('&#x5218;&#x7490;'), ('&#x738B;&#x7F8E;&#x4E3D;');"
    # &#x5220;&#x9664; SQ L&#x8BED;&#x53E5;
    # sql = "delete from students where id = 5;"
    # &#x4FEE;&#x6539; SQL &#x8BED;&#x53E5;
    sql = "update students set name = '&#x738B;&#x94C1;&#x86CB;' where id = 6;"
    # &#x6267;&#x884C; SQL &#x8BED;&#x53E5;
    row_count = cursor.execute(sql)
    print("SQL &#x8BED;&#x53E5;&#x6267;&#x884C;&#x5F71;&#x54CD;&#x7684;&#x884C;&#x6570;%d" % row_count)
    # &#x63D0;&#x4EA4;&#x6570;&#x636E;&#x5230;&#x6570;&#x636E;&#x5E93;
    conn.commit()
except Exception as e:
    # &#x56DE;&#x6EDA;&#x6570;&#x636E;&#xFF0C; &#x5373;&#x64A4;&#x9500;&#x521A;&#x521A;&#x7684;SQL&#x8BED;&#x53E5;&#x64CD;&#x4F5C;
    conn.rollback()

&#x5173;&#x95ED;&#x6E38;&#x6807;
cursor.close()

&#x5173;&#x95ED;&#x8FDE;&#x63A5;
conn.close()

3.防止SQL注入

&#x4EC0;&#x4E48;&#x662F;SQL&#x6CE8;&#x5165;?&#x7528;&#x6237;&#x63D0;&#x4EA4;&#x5E26;&#x6709;&#x6076;&#x610F;&#x7684;&#x6570;&#x636E;&#x4E0E;SQL&#x8BED;&#x53E5;&#x8FDB;&#x884C;&#x5B57;&#x7B26;&#x4E32;&#x65B9;&#x5F0F;&#x7684;&#x62FC;&#x63A5;&#xFF0C;&#x4ECE;&#x800C;&#x5F71;&#x54CD;&#x4E86;SQL&#x8BED;&#x53E5;&#x7684;&#x8BED;&#x4E49;&#xFF0C;&#x6700;&#x7EC8;&#x4EA7;&#x751F;&#x6570;&#x636E;&#x6CC4;&#x9732;&#x7684;&#x73B0;&#x8C61;&#x3002;

&#x5982;&#x4F55;&#x9632;&#x6B62;SQL&#x6CE8;&#x5165;?

1.SQL&#x8BED;&#x53E5;&#x53C2;&#x6570;&#x5316;

SQL&#x8BED;&#x8A00;&#x4E2D;&#x7684;&#x53C2;&#x6570;&#x4F7F;&#x7528;%s&#x6765;&#x5360;&#x4F4D;&#xFF0C;&#x6B64;&#x5904;&#x4E0D;&#x662F;python&#x4E2D;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x683C;&#x5F0F;&#x5316;&#x64CD;&#x4F5C;, &#x5C06;SQL&#x8BED;&#x53E5;&#x4E2D;%s&#x5360;&#x4F4D;&#x6240;&#x9700;&#x8981;&#x7684;&#x53C2;&#x6570;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x5217;&#x8868;&#x4E2D;&#xFF0C;&#x628A;&#x53C2;&#x6570;&#x5217;&#x8868;&#x4F20;&#x9012;&#x7ED9;execute&#x65B9;&#x6CD5;&#x4E2D;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;

&#x9632;&#x6B62;SQL&#x6CE8;&#x5165;&#x7684;&#x793A;&#x4F8B;&#x4EE3;&#x7801;(&#x8BF4;&#x660E;:execute&#x65B9;&#x6CD5;&#x4E2D;&#x7684; %s &#x5360;&#x4F4D;&#x4E0D;&#x9700;&#x8981;&#x5E26;&#x5F15;&#x53F7;):

from pymysql import connect

def main():

    find_name = input("&#x8BF7;&#x8F93;&#x5165;&#x7269;&#x54C1;&#x540D;&#x79F0;&#xFF1A;")

    # &#x521B;&#x5EFA;Connection&#x8FDE;&#x63A5;
    conn = connect(host='localhost',port=3306,user='root',password='xxxx',database='jing_dong',charset='utf8')
    # &#x83B7;&#x5F97;Cursor&#x5BF9;&#x8C61;
    cs1 = conn.cursor()

    # &#x975E;&#x5B89;&#x5168;&#x7684;&#x65B9;&#x5F0F;
    # &#x8F93;&#x5165; ' or 1 = 1 or '   (&#x5355;&#x5F15;&#x53F7;&#x4E5F;&#x8981;&#x8F93;&#x5165;)
    # sql = "select * from goods where name='%s'" % find_name
    # print("""sql===>%s<====""" % sql) # 执行select语句,并返回受影响的行数:查询所有数据 count="cs1.execute(sql)" 安全的方式 构造参数列表 params="[find_name]" * from goods where name="%s"," params) 注意: 如果要是有多个参数,需要进行参数化 那么params="[&#x6570;&#x503C;1," 数值2....],此时sql语句中有多个%s即可 %s 不需要带引号 打印受影响的行数 print(count) 获取查询的结果 result="cs1.fetchone()" 打印查询的结果 print(result) 关闭cursor对象 cs1.close() 关闭connection对象 conn.close() if __name__="=" '__main__': main() < code></====""">

&#x4F8B;7&#xFF1A;&#x5BF9;MySQL&#x6570;&#x636E;&#x5E93;&#x722C;&#x53D6;&#x7684;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x8BCD;&#x9891;&#x7EDF;&#x8BA1; -- &#xFF08;sql&#x8BED;&#x53E5;+jieba&#x5E93;&#xFF09;
import pymysql
import jieba.analyse

def get_sql(sql):
    # 1.&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;
    conn = pymysql.connect(host="127.0.0.1", user="root", passwd="xxxx", db="dangdang", charset="utf8",port=3306)

    # 2.&#x83B7;&#x53D6;&#x6E38;&#x6807;&#x5BF9;&#x8C61;
    cursor = conn.cursor()

    # 3.&#x6267;&#x884C;SQL&#x8BED;&#x53E5; &#xFF08;&#x8FD4;&#x56DE;&#x503C;&#x662F;&#x5728;&#x6267;&#x884C;&#x4E2D;&#x5F71;&#x54CD;&#x7684;&#x884C;&#x6570;&#xFF09;
    rew_count = cursor.execute(sql)

     # 4.&#x53D6;&#x51FA;&#x7ED3;&#x679C;&#x96C6;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x6570;&#x636E;
    print("SQL&#x8BED;&#x53E5;&#x6267;&#x884C;&#x5F71;&#x54CD;&#x7684;&#x884C;&#x6570;" + str(rew_count))
    content = ''
    for line in cursor.fetchall():
        content = content + line[0]
        print(line[0], ' ', line[1])

    jieba.analyse.set_stop_words('../otherFile/&#x4E2D;&#x6587;&#x505C;&#x7528;&#x8BCD;&#x8868;.txt')  # ..&#x8868;&#x793A;&#x5F53;&#x524D;&#x8DEF;&#x5F84;&#x4E0B;&#x7684;&#x4E0A;&#x4E00;&#x7EA7;&#x76EE;&#x5F55;
    tags = jieba.analyse.extract_tags(content, topK=100, withWeight=True)
    for j,item in enumerate(tags):
        print("&#x7B2C;" + str(j + 1) + "&#x540D;&#xFF1A;" + item[0] + "    &#x6B21;&#x6570;:" + str(int(item[1] * 1000)))

    # 5.&#x5173;&#x95ED;&#x6E38;&#x6807;&#xFF0C;&#x5173;&#x95ED;&#x8FDE;&#x63A5;
    cursor.close()
    conn.close()

if __name__=='__main__':
    words = "'%Java%'"
    sql = "select * from books where title like " + words
    get_sql(sql)

1.res.encoding响应解码

unicode&#x89E3;&#x7801;

res = requests.get(url,headers)
res.encoding = 'unicode_escape'

2.encode字符串解码

response.text.encode('unicode_escape')

1.引入上级

import sys
sys.path.append("..")
### &#x5982;&#x679C;&#x662F;&#x5F53;&#x524D;&#x9875;&#x9762;&#x4F7F;&#x7528;&#xFF0C;&#x5219;&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x5230;&#x7CFB;&#x7EDF;&#x8DEF;&#x5F84;&#x4E2D;
from ..config.request import getResponse
from config.request import getResponse

2.引入同级

&#x5F15;&#x5165;&#x6240;&#x6709;&#x6A21;&#x5757;
from .models import *

&#x5F15;&#x5165;&#x90E8;&#x5206;&#x6A21;&#x5757;
from .models import Student

注意:如果需要封装在一个文件夹下,需要在新文件夹下添加_ init _.py文件

如果还要整体文件夹当作一个模块,文件夹下的文件作为子模块,,则需要在_ init _.py文件下添加以下内容

__all__ = [
    'IndexViews',
    'UsersViews',
]

Original: https://blog.csdn.net/qq_50792097/article/details/126564984
Author: 起航吧!少年
Title: python学习(二):python的数据挖掘技术,网络爬虫

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/639707/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球