文字列を辞書に変換する方法:
# 字典推导式
cookies="anonymid=j3jxk555-nrn0wh; _r01_=1; _ga=GA1.2.1274811859.1497951251; _de=BF09EE3A28DED52E6B65F6A4705D973F1383380866D39FF5; [email protected]; depovince=BJ; jebecookies=54f5d0fd-9299-4bb4-801c-eefa4fd3012b|||||; JSESSIONID=abcI6TfWH4N4t_aWJnvdw; ick_login=4be198ce-1f9c-4eab-971d-48abfda70a50; p=0cbee3304bce1ede82a56e901916d0949; first_login_flag=1; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/20171230/1635/main_JQzq_ae7b0000a8791986.jpg; t=79bdd322e760beae79c0b511b8c92a6b9; societyguester=79bdd322e760beae79c0b511b8c92a6b9; id=327550029; xnsid=2ac9a5d8; loginfrom=syshome; ch_id=10016; wp_fold=0"
cookies = {
i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
#字典是无序的
# 列表推导式
self.url_temp = "https://tieba.baidu.com/f?kw=" + tieba_name + "&ie=utf-8&pn={}"
return [self.url_temp.format(i * 50) for i in range(1000)]
使用法を要求する:
tips:response.text 对象中,名词一般是属性,动词一般是方法,需要加括号
byte型数据(字符串前面加b'的),解码时用decode:
例:b'<!DOCTYPE html>\.... </html>\r\n'
response.content.decode()
# requests中解决编解码的方法
response.content.decode()
response.content.decode("gbk")
response.text
import json
json.loads(response.content.decode())
データ抽出方法
jsonデータ抽出
- jsonの文字列はすべて二重引用符で囲まれています
- 二重引用符でない場合
- eval:単純な文字列とPythonの型変換を実現できます
- 置換:一重引用符を二重引用符に置き換えます
- 二重引用符でない場合
json.loads()和json.dump()
html_str = parse_url(url)
# json.loads把json字符串转化为python类型(字典)
ret1 = json.loads(html_str)
# json.dumps能够把python类型转化为json字符串
# ensure_ascii=False设置编码, indent=4设置换行缩进,都是为了使数据看起来更美观
# encoding="utf-8" 也是必要的
with open("douban.json","w",encoding="utf-8") as f:
f.write(json.dumps(ret1, ensure_ascii=False, indent=4))
正規表現
常用正则表达式的方法:
re.compile(编译)
pattern.match(从头找一个)
pattern.search(找一个)
pattern.findall(找所有)
pattern.sub(替换)
注意点を使用する:
re.findall("a(*?)b","str")
、角かっこ内のコンテンツを返すことができます。角かっこの前後のコンテンツは、配置とフィルタリングの役割を果たします。- 元の文字列r、一致する文字列にバックスラッシュがある場合、rを使用すると、バックスラッシュによってもたらされるエスケープ効果を無視できます。
- デフォルトではドットは一致しません\ n
\s
スペースだけでなく、空白の文字列も照合できます\t \r \n
Xpath学習
- xpathヘルパーを使用するかChromeでxpathをコピーすることは要素から抽出されたデータですが、クローラーはURLに対応する応答を取得します。これは多くの場合要素とは異なります。
- テキストを取得する
a/text()
下のテキストを取得しますa//text()
下のすべてのタグに含まれるテキストを取得します//a[text()='下一页']
テキストに基づいて選択
- 属性を取得する
@符号
- / html / head / link /
//ul[@id="detail-list"]
//
- xpathの先頭では、現在のhtmlの任意の位置から選択することを意味します
li//a
liの下のラベルを示します(/を使用する場合は、1つのレベルと1つのレベルを選択する必要がありますが、これはより複雑です)
示例:
//ul[@id="detail-list"]/li/a[@class='image share-url']/@href
# /@href 用于获取标签中的网页链接
コードでxpathを使用する
lxmlライブラリを使用する必要があります
- 入門:
- lxmlからetreeライブラリの
lxmlをインポートしますimportetree - etree.HTMLを使用して、文字列をElementオブジェクトに変換します
- 要素オブジェクトにはxpathメソッドがあります
html = etree.HTML(text)
- lxmlからetreeライブラリの
from lxml import etree
text = ''' <div> <ul>
<li class="item-1"><a>first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul> </div> '''
html = etree.HTML(text)
print(html)
#查看element对象中包含的字符串
print(etree.tostring(html).decode())
#获取class为item-1 li下的a的herf
ret1 = html.xpath("//li[@class='item-1']/a/@href")
#获取class为item-1 li下的a的文本
ret2 = html.xpath("//li[@class='item-1']/a/text()")
#分组,根据li标签进行分组,对每一组继续写xpath
ret3 = html.xpath("//li[@class='item-1']")
print(ret3)
for i in ret3:
item= {
}
item["title"] = i.xpath("./a/text()")[0] if len(i.xpath("./a/text()"))>0 else None
item["href"] = i.xpath("./a/@href")[0] if len( i.xpath("./a/@href"))>0 else None
print(item)
Scrapy
基本コンセプト
- 非同期と非ブロッキングの違い
异步
:呼び出しが発行された後、呼び出しは結果に関係なく直接戻ります[同步异步是过程]
非阻塞
:呼び出しの結果(メッセージ、戻り値)を待っている間、プログラムの状態に焦点が当てられます。これは、結果がすぐに取得できない前に、呼び出しが現在のスレッドをブロックしないことを意味します。[阻塞非阻塞是状态,拿到返回值前的状态,就是不用一直等,可以做其他事情]
Scrapyプロセス
Scrapyを使い始める
- かすれたプロジェクトを作成する
scrapy startproject [项目名]
- クローラーをスポーンします
# 需要先进入项目文件下
cd myproject
scrapy genspider [爬虫名] [域名]
# 运行爬虫
scrapy scrawl itcast
- データの抽出、
完全なスパイダー、xpathおよびその他の方法の使用 - データ
パイプラインにデータを保存する