Python学习日志(六)

今天学习使用Python来爬取网站上的小说,以requests代替了原来的urllib.request。(语句和urllib不太一样,但是语句用法大致相同)。
用法如下:
开始请求网络数据:
第一个参数:请求的地址 第二个参数:请求头文件信息;
requests_01 = requests.get(url=url,data = header);
将网站下载到本地中
print(“当前网页的编码格式:”,requests_01.encoding);
修改请求到的数据编码格式
requests_01.encoding = “gbk”;
请求源码 - data = html.read();
data = requests_01.text;
开始解析数据
soup = BeautifulSoup(data,“html.parser”);
获取整个div
div_listmain = soup.find(“div”,attrs={“class”:“listmain”});
获取dl
dl_01 =div_listmain.dl;
在开始之前,先创建一个爬虫入口:
if name == “main”:
值得一提,有句话经典的概括了这段代码的意义:“Make a script both importable and executable”,意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。
这句话,可能一开始听的还不是很懂。下面举例说明:
先写一个模块:
def main():
print “we are in %s”%name
if name == ‘main’:
main()
这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出”we are in main“,说明我们的if语句中的内容被执行了,调用了main():
但是如果我们从另我一个模块导入该模块,并调用一次main()函数会是怎样的结果呢?
#anothermodle.py
from module import main
main()
其执行的结果是:we are in module
但是没有显示”we are in main“,也就是说模块__name__ = ‘main’ 下面的函数没有执行。
这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。
总结一下:
如果我们是直接执行某个.py文件的时候,该文件中那么”name == ‘main’“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if name == ‘main’“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
创建网络请求时,可以创建一个用户代理(UA),来请求header文件,(或者骗过网站)
ua可在网站右键中寻找。
(replace(" “,”"):用于去除字符串中所有的空格。)
在具体下载时:
创建一个变量,用于记录什么时候开始下载
start_dowm = False;
i = 1;
遍历所有数据
for tab_dd in dl_01:
if tab_dd == “\n”:
pass
elif tab_dd.string.replace(" “,”") == “”:
start_dowm = True;
pass
elif start_dowm:
# 开始下载:
# 间隔:0.5秒下载一章
a_context =tab_dd.a.string;
a_context_url =“https://www.XXXXX.com”+tab_dd.a[“href”]
print("[%s]下载地址:%s"%(a_context,a_context_url));
# 调用函数下载小说内容:
# 第一个参数:小说每个章节名称 第二个参数:小说的每个章节的地址
time.sleep(5);
Get_xiaoshuo_mulu_context(a_context,a_context_url,header);

发布了21 篇原创文章 · 获赞 1 · 访问量 1574

猜你喜欢

转载自blog.csdn.net/qq_33566628/article/details/88536920