Python自学笔记 1
爬取目标网站新闻标题以及新闻链接
定义一个BtcSpyder类
`
import requests
from lxml import etree
import json
#class BtcSpyder(boject): class BtcSpyder(): class BtcSpyder: 这三种写法是一样的 在 python3 中
class BtcSpyder:
def __init__(self):
self.base_url = "https://www.chainnode.com/forum/1-"
self.headers = {
"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64;rv: 72.0) Gecko / 20100101Firefox / 72.0"
}
self.data_list = []
# 1.发请求
def get_response(self,url):
free_proxy = {"http": "60.169.134.49:9999"}
response = requests.get(url,headers=self.headers,proxies=free_proxy,timeout=10)
data = response.content.decode()
return data
#2.解析数据
#使用xpath解析获得该页面所有新闻的 title 和 url
def parse_data(self,data):
#转类型
#xpath 语法 1. 节点 /
# 2.跨节点 //
# 3.寻找精确标签 //标签[@属性="属性值"]
# 4.标签包裹的内容 /text()
# 5.属性 @属性
x_data = etree.HTML(data)
title_list = x_data.xpath('//a[@class="link-dark-major font-bold bbt-block"]/text()')
url_list = x_data.xpath('//a[@class="link-dark-major font-bold bbt-block"]/@href')
data_list = []
print(title_list)
print(url_list)
#注释 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
for index,title in enumerate(title_list):
news = {}
news["name"] = title
news["url"] = url_list[index]
self.data_list.append(news)
for dic in self.data_list:
for key,value in dic.items():
dic[key] = value.rstrip()
#3.保存数据
#利用json.dumbs()将dic类型转为str类型
def save_data(self):
data_str = json.dumps(self.data_list)
with open("8btc.json","w") as f:
f.write(data_str)
#4.启动
def run(self):
#for循环爬取1-4页的内容
for i in range(1,5):
url = self.base_url+str(i)
print(url)
data = self.get_response(url)
self.parse_data(data)
self.save_data()
#调用run方法
BtcSpyder().run()