Python总结-----爬虫战斗篇

128 阅读22分钟

工具篇

[Xpath Help] (chrome.google.com/webstore/de…) 谷歌插件(谷歌商店你懂得)

爬取凤凰首页新闻

插件使用j.jpg)

提取全部修改Xpath语法即可

在python上如何使用?


代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import requests
from lxml import etree
from lxml.html import tostring#将某个元素节点 保存为字符串
import json


def getNews():
	
	url = 'https://news.ifeng.com/'
	html = requests.get(url=url)
	html = html.content.decode('utf-8')
	news_tree = etree.HTML(html)

	# #xpath返回一个集合数组,如果有20条,则数组的len为20
	titles = news_tree.xpath(
		'//*[@id="root"]/div[6]/div[1]/div[5]/ul/li/a/@title')
	hrefs = news_tree.xpath('//*[@id="root"]/div[6]/div[1]/div[5]/ul/li/a/@href')
	imgs = news_tree.xpath(
		'//*[@id="root"]/div[6]/div[1]/div[5]/ul/li/a/img/@src')
	times = news_tree.xpath(
		'//*[@id="root"]/div[6]/div[1]/div[5]/ul/li/div/div/time')
	tags = news_tree.xpath(
		'//*[@id="root"]/div[6]/div[1]/div[5]/ul/li/div/div/span')



	#通过遍历,获得每一个的信息,然后存入字典中
	#然后存入数组,返回json数据

	array = []

	count = 0

	while (count < len(titles)):
		title = titles[count]
		link = hrefs[count]
		img = imgs[count]
		time = times[count].text
		tag = tags[count].text

		dic = {'title': title, 'href': link, 'img': img, 'time': time, 'tag': tag}
		array.append(dic)
		count = count + 1
	 
	
	return json.dumps(array, ensure_ascii=False)

if __name__ == "__main__":
	jsonstring = getNews()
	print(jsonstring)

打印输入如下:

[{
	"title": "绿地回应被举报高管贪腐问题:调查中 不会姑息",
	"href": "//news.ifeng.com/c/7weTelvvWbY",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/CDB7AA8A2B55483B843DAF99CE559E11_w698_h392.png",
	"time": "今天 12:05",
	"tag": "中国新闻网"
}, {
	"title": "美国抗议者在白宫外放装尸袋办“葬礼” 问责政府抗疫不力",
	"href": "//news.ifeng.com/c/7weTH6IwesH",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/ucms/2020_21/0370BFA6C72EAB721A55DB02731CED811930349E_w698_h392.png",
	"time": "今天 12:05",
	"tag": "环球网"
}, {
	"title": "张文宏:各地有偶发病例是大概率事件,应长期保持适当社交距离",
	"href": "//news.ifeng.com/c/7weRdCzXkJc",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/1F2D720F73E54AF8956B39DB212606C6_w690_h387.jpg",
	"time": "今天 11:37",
	"tag": "张文宏医生"
}, {
	"title": "又美又有才,难道她就是特朗普的“完美”发言人?",
	"href": "//news.ifeng.com/c/7weRLg43Viq",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/2CB1E314289C482395DE1CD313E0CCD2_w698_h392.jpg",
	"time": "今天 11:33",
	"tag": "冰汝看美国"
}, {
	"title": "美国传染病专家福奇两周未接受采访,美媒怀疑其被禁声",
	"href": "//news.ifeng.com/c/7weOmUniq6O",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/9DE3F1B1A36F4832BA4DF6D12267D80C_w698_h392.jpg",
	"time": "今天 11:15",
	"tag": "澎湃新闻"
}, {
	"title": "酒驾致广东援鄂医生王烁殉职案开庭 被告曾以涉嫌交通肇事罪被批捕",
	"href": "//news.ifeng.com/c/7wePraJu7kG",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/3968E83E17854629AC6BDEE647F8C3B4_w698_h392.png",
	"time": "今天 11:10",
	"tag": "南方都市报"
}, {
	"title": "全国政协会议将为抗疫牺牲烈士和逝世同胞默哀一分钟",
	"href": "//news.ifeng.com/c/7wePxtxWRZA",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/4F5C7FED0DA045EE96DDD311B4542436_w533_h299.jpg",
	"time": "今天 11:09",
	"tag": "工人日报"
}, {
	"title": "全国人大代表姚劲波:降低公积金缴存比例,减轻企业经营负担",
	"href": "//news.ifeng.com/c/7wePkyXwfho",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/ucms/2020_21/740C78C4AE2878A548CAFB829EA511B7B5405646_w698_h392.jpg",
	"time": "今天 11:08",
	"tag": "澎湃新闻网"
}, {
	"title": "人民日报:把“黑暴”赶出香港,得从根上拔除“毒瘤”",
	"href": "//news.ifeng.com/c/7wePQZK5wUS",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/07991C78F2EA42DB85E525BE4E847C6F_w600_h336.jpg",
	"time": "今天 11:05",
	"tag": "人民日报"
}, {
	"title": "华为美国高管:美国断供我们能挺过去,不过大量美国人会失业",
	"href": "//news.ifeng.com/c/7wePHsPV6UC",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/01D0AD2B338D469286850CC5CD8F19AE_w569_h319.jpg",
	"time": "今天 11:04",
	"tag": "环球网"
}, {
	"title": "人大代表建议:取消生育三孩以上的处罚政策 国家给予育儿补贴",
	"href": "//news.ifeng.com/c/7weNTNgpLOi",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/ucms/2020_21/630A01F7A7A78464A6D06536A6A6873858EFD058_w698_h392.jpg",
	"time": "今天 11:00",
	"tag": "新京报"
}, {
	"title": "疯狂的头盔:我10天赚了800万",
	"href": "//news.ifeng.com/c/7weOSjP6hN2",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/9CCED3FB9DFF4554B5C9F9FC4599B608_w512_h287.jpg",
	"time": "今天 10:53",
	"tag": "纵相新闻"
}, {
	"title": "美国加州联邦参议员提议案 谴责“中国病毒”等词汇指称新冠",
	"href": "//news.ifeng.com/c/7weNkE8jFA0",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/FF274567E4C0492496E65C1ECF119A87_w698_h392.jpg",
	"time": "今天 10:44",
	"tag": "中国日报网"
}, {
	"title": "王学坤委员:建议建立农民退休制度  让65岁以上农民“洗脚上田,老有所养”",
	"href": "//news.ifeng.com/c/7weNbtSo7v6",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/75DF69024398483AAA24F657C0EC764F_w602_h338.png",
	"time": "今天 10:39",
	"tag": "最高人民检察院"
}, {
	"title": "特朗普叫嚣“中国有个疯子”,评论区翻车",
	"href": "//news.ifeng.com/c/7weN4fqF7BI",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/4969C19002F340678BCC48B9266B1D2C_w698_h392.jpg",
	"time": "今天 10:32",
	"tag": "观察者网"
}, {
	"title": "军报头版评论:“蓬佩奥们”边喊抓贼边做贼,下场注定可悲",
	"href": "//news.ifeng.com/c/7weMvlBWShM",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/636D31AEB733412F96581882FCEFC64E_w698_h392.png",
	"time": "今天 10:31",
	"tag": "解放军报"
}, {
	"title": "特殊时期的中国两会 外媒都在关注这些",
	"href": "//news.ifeng.com/c/7weMghINhz6",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/D4270B52C0C14B72909202DBABECE1B6_w698_h392.jpg",
	"time": "今天 10:28",
	"tag": "央视新闻客户端"
}, {
	"title": "雷军建议:进一步降低民营企业进入卫星互联网门槛",
	"href": "//news.ifeng.com/c/7weL0NllooO",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/ucms/2020_21/AB6E6070DCCBE7465220469B2578CD910EA67390_w698_h392.jpg",
	"time": "今天 10:20",
	"tag": "澎湃新闻"
}, {
	"title": "北京15座王府14座被占,政协委员:应设腾退协调机构",
	"href": "//news.ifeng.com/c/7weKz9vBGm5",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/ucms/2020_21/429BCCAD3FC016669563C909F36859F71B506DE0_w698_h392.jpg",
	"time": "今天 10:20",
	"tag": "新京报"
}, {
	"title": "荷兰政府:水貂可能将新冠病毒传给人  清查所有养殖场",
	"href": "//news.ifeng.com/c/7weKeI1Yr6D",
	"img": "//d.ifengimg.com/w144_h80_q70/x0.ifengimg.com/thmaterial/2020_21/09FBF81BFE594527AAF2C36D2ED4EEDF_w519_h291.jpg",
	"time": "今天 10:16",
	"tag": "观察者网"
}]
如果需要新闻详情呢:

**方式一:**直接在列表中返回,也就是在 getNews() 方法中,先获取到连接 hrefs 然后遍历链接 得到 href 再去重新使用 lxml 抓取,这种方式对直接返回给客户端使用不是很友好,一个是返回 json 体积过大,一个是等待时间过长

**方式二:**重写抓取函数,传入相对应页面的 URL 获取详情数据代码如下:

def getNewsContent(url):
    	
	html = requests.get(url=url)
	html = html.content.decode('utf-8')
	news_content_tree = etree.HTML(html)

	#因为xpath 语法可以保证只获取一个详情元素,所以直接取第一个即可
	content = news_content_tree.xpath(
		'//*[@id="root"]/div/div[3]/div[1]/div[1]/div[3]')[0]

	content_html = str(tostring(content))
	#如果打印 会发现 前面有一个(b') 以及最后的 (') 所以直接执行切割字符串操作
	content_html_text = content_html[2:len(content_html)-1]

	return content_html_text

打印数据如下:

<div class="main_content-LcrEruCc"><div><div class="text-3zQ3cZD4"><p>&#36817;&#26085;&#65292;21&#23681;&#30340;&#20924;&#22025;&#35946;&#22240;&#26292;&#21160;&#32618;&#34987;&#39321;&#28207;&#27861;&#38498;&#21028;&#21009;4&#24180;&#65292;&#20182;&#22312;&#27714;&#24773;&#20449;&#20013;&#35828;&#65306;&#8220;&#27809;&#26377;&#19968;&#22825;&#19981;&#21518;&#24724;&#8221;&#12290;2019&#24180;6&#26376;&#33267;2020&#24180;4&#26376;15&#26085;&#65292;8001&#20154;&#34987;&#25429;&#65292;1365&#20154;&#34987;&#36215;&#35785;&#65292;566&#20154;&#34987;&#25511;&#26292;&#21160;&#32618;&#12290;&#20010;&#20307;&#30340;&#24754;&#21095;&#36824;&#22312;&#25345;&#32493;&#19978;&#28436;&#65292;&#25968;&#23383;&#30340;&#25578;&#24515;&#35753;&#20154;&#25345;&#20037;&#38590;&#24179;&#65292;&#19968;&#22330;&#8220;&#20462;&#20363;&#39118;&#27874;&#8221;&#36896;&#23601;&#30340;&#26292;&#21147;&#26059;&#28065;&#65292;&#24050;&#35753;&#22810;&#23569;&#39321;&#28207;&#24180;&#36731;&#20154;&#21629;&#36816;&#33073;&#36712;&#12289;&#21069;&#36884;&#27585;&#24323;&#12290;</p><p>&#26366;&#32463;&#25317;&#26377;&#30340;&#19996;&#35199;&#22240;&#20026;&#21442;&#19982;&#38750;&#27861;&#26292;&#21147;&#27963;&#21160;&#32780;&#20007;&#22833;&#65292;&#19968;&#30452;&#25317;&#26377;&#30340;&#29983;&#27963;&#22240;&#20026;&#26292;&#21147;&#30772;&#22351;&#32780;&#27490;&#27493;&#65292;&#29422;&#23376;&#23665;&#19979;&#30340;&#32439;&#20081;&#20260;&#23475;&#20102;&#22810;&#23569;&#36880;&#26790;&#36335;&#19978;&#30340;&#20154;&#12290;&#22238;&#26395;&#39321;&#28207;&#8220;&#20462;&#20363;&#39118;&#27874;&#8221;&#65292;&#27491;&#26159;&#22240;&#20026;&#21453;&#20013;&#20081;&#28207;&#20998;&#23376;&#40723;&#21561;&#26292;&#21147;&#12289;&#29053;&#24785;&#26292;&#21147;&#65292;&#34987;&#27927;&#33041;&#30340;&#24180;&#36731;&#20154;&#36855;&#20449;&#26292;&#21147;&#12289;&#20351;&#29992;&#26292;&#21147;&#65292;&#39321;&#28207;&#25165;&#32467;&#20986;&#20102;&#23401;&#23376;&#26377;&#23478;&#38590;&#22238;&#12289;&#26377;&#26790;&#38590;&#22278;&#65292;&#24066;&#27665;&#26377;&#24037;&#38590;&#24320;&#12289;&#26080;&#24037;&#21487;&#24320;&#30340;&#33510;&#26524;&#65292;&#35753;&#32321;&#33635;&#31283;&#23450;&#30340;&#39321;&#28207;&#38519;&#20837;&#21361;&#26426;&#22256;&#22659;&#12290;</p><p><img src="https://x0.ifengimg.com/ucms/2020_21/A1688E829DE205EEBC309384E3783FE8BA15437D_w1080_h1920.jpg"></p><p>&#36825;&#26159;&#39321;&#28207;&#24066;&#27665;&#24819;&#35201;&#30340;&#21527;&#65311;&#26368;&#22522;&#26412;&#30340;&#23433;&#20840;&#34987;&#21093;&#22842;&#65292;&#20986;&#34892;&#24597;&#26377;&#20154;&#21448;&#21435;&#30776;&#22320;&#38081;&#65292;&#33829;&#19994;&#24597;&#40657;&#34915;&#20154;&#21448;&#26469;&#25171;&#30776;&#65292;&#39277;&#26700;&#19978;&#26377;&#19981;&#21516;&#25919;&#35265;&#20063;&#19981;&#25954;&#36731;&#26131;&#21457;&#34920;&#65292;&#26657;&#22253;&#37324;&#31455;&#25104;&#20102;&#8220;&#20853;&#24037;&#21378;&#8221;&#65307;&#20154;&#34987;&#36148;&#19978;&#26631;&#31614;&#65292;&#24215;&#34987;&#36148;&#19978;&#26631;&#31614;&#65292;&#34987;&#36215;&#24213;&#12289;&#34987;&#25490;&#26021;&#12289;&#34987;&#25915;&#20987;&#65292;&#22312;&#25152;&#35859;&#8220;&#31169;&#20102;&#8221;&#21644;&#8220;&#35013;&#20462;&#8221;&#20043;&#19979;&#65292;&#40657;&#33394;&#24656;&#24598;&#30340;&#21033;&#20995;&#25139;&#36827;&#24066;&#27665;&#30340;&#24515;&#65292;&#35753;&#20154;&#26222;&#36941;&#21464;&#24471;&#28966;&#34385;&#12289;&#24656;&#24807;&#12290;&#22240;&#20026;&#26292;&#24466;&#65292;&#20010;&#20154;&#36825;&#23567;&#23478;&#34987;&#40657;&#26263;&#21253;&#35065;&#65292;&#22240;&#20026;&#26292;&#21147;&#65292;&#39321;&#28207;&#36825;&#20010;&#22823;&#23478;&#24050;&#28385;&#30446;&#30126;&#30157;&#65292;&#24590;&#33021;&#19981;&#35753;&#20154;&#24515;&#30171;&#12289;&#19981;&#35753;&#20154;&#24868;&#24936;&#65292;&#19981;&#35753;&#20154;&#26399;&#30460;&#39321;&#28207;&#37325;&#24402;&#31077;&#21644;&#23433;&#23450;&#65281;</p><p>&#22312;&#8220;&#20462;&#20363;&#39118;&#27874;&#8221;&#20013;&#65292;&#20154;&#20204;&#24050;&#32463;&#30475;&#23613;&#26292;&#21147;&#30340;&#21361;&#23475;&#12289;&#26292;&#24466;&#30340;&#20982;&#27531;&#12290;&#29305;&#21306;&#25919;&#24220;&#35686;&#21153;&#22788;&#22788;&#38271;&#37011;&#28851;&#24378;&#27492;&#21069;&#34920;&#31034;&#65292;&#39321;&#28207;&#27491;&#38754;&#20020;&#26412;&#22303;&#24656;&#24598;&#20027;&#20041;&#30340;&#23041;&#32961;&#65292;&#23041;&#32961;&#21040;&#39321;&#28207;&#24066;&#27665;&#30340;&#20154;&#36523;&#23433;&#20840;&#65292;&#20063;&#22312;&#23545;&#22269;&#23478;&#23433;&#20840;&#36896;&#25104;&#20914;&#20987;&#12290;&#21453;&#26292;&#21147;&#65292;&#26159;&#22240;&#20026;&#26292;&#21147;&#24050;&#28183;&#36879;&#36827;&#39321;&#28207;&#24066;&#27665;&#30340;&#26085;&#24120;&#29983;&#27963;&#65292;&#21361;&#38505;&#36817;&#22312;&#21675;&#23610;&#65307;&#26159;&#22240;&#20026;&#26292;&#21147;&#36824;&#26377;&#24310;&#32493;&#12289;&#25193;&#25955;&#21644;&#21319;&#32423;&#30340;&#21487;&#33021;&#65292;&#35201;&#25703;&#27585;&#23478;&#22253;&#65307;&#26159;&#22240;&#20026;&#26292;&#21147;&#19981;&#27490;&#65292;&#26292;&#24466;&#23558;&#26356;&#21152;&#29462;&#29378;&#65292;&#21453;&#20013;&#20081;&#28207;&#20998;&#23376;&#23558;&#26356;&#21152;&#22179;&#24352;&#65292;&#39321;&#28207;&#35201;&#33900;&#36865;&#25481;&#19968;&#20195;&#20195;&#20154;&#36763;&#33510;&#24314;&#31435;&#30340;&#22522;&#19994;&#65292;&#36745;&#29004;&#31687;&#31456;&#34987;&#24656;&#24598;&#20027;&#20041;&#28270;&#28781;&#12290;</p><p>&#36890;&#36807;&#39321;&#28207;&#35686;&#26041;&#20005;&#27491;&#25191;&#27861;&#65292;&#39321;&#28207;&#26292;&#24466;&#30340;&#27668;&#28976;&#24050;&#34987;&#21387;&#21046;&#65307;&#30001;&#20110;&#39321;&#28207;&#24066;&#27665;&#25317;&#25252;&#27490;&#26292;&#21046;&#20081;&#65292;&#39321;&#28207;&#26292;&#21147;&#30340;&#22303;&#22756;&#27491;&#34987;&#36880;&#27493;&#38130;&#38500;&#12290;&#20294;&#21457;&#29983;&#22312;&#39321;&#28207;&#30340;&#26292;&#21147;&#24182;&#26410;&#32477;&#36857;&#65292;&#34850;&#34850;&#27442;&#21160;&#30340;&#26292;&#24466;&#36824;&#22312;&#20282;&#26426;&#32780;&#21160;&#12290;5&#26376;&#20221;&#21069;&#21518;&#65292;&#20154;&#20204;&#21448;&#30475;&#21040;&#20102;&#26292;&#24466;&#25237;&#25527;&#30340;&#29123;&#28903;&#24377;&#65292;&#30475;&#21040;&#20102;&#26292;&#24466;&#23492;&#20986;&#30340;&#24656;&#21523;&#37038;&#20214;&#12290;&#39321;&#28207;&#24066;&#27665;&#38656;&#35201;&#24378;&#21270;&#20849;&#35782;&#65292;&#19968;&#36215;&#21521;&#26292;&#21147;&#35828;&#19981;&#65307;&#39321;&#28207;&#35686;&#26041;&#38656;&#35201;&#20877;&#25509;&#20877;&#21385;&#65292;&#19981;&#32473;&#26292;&#24466;&#20219;&#20309;&#21912;&#24687;&#20043;&#26426;&#12290;&#26356;&#38656;&#20174;&#26681;&#26412;&#19978;&#24819;&#21150;&#27861;&#65292;&#26681;&#27835;&#8220;&#40657;&#26292;&#8221;&#36825;&#20010;&#27602;&#30244;&#12290;&#21482;&#26377;&#35753;&#26292;&#24466;&#12289;&#26292;&#21147;&#25104;&#36807;&#34903;&#32769;&#40736;&#12289;&#20247;&#30690;&#20043;&#30340;&#65292;&#32437;&#26292;&#12289;&#26045;&#26292;&#30340;&#20154;&#20184;&#20986;&#27785;&#37325;&#30340;&#20195;&#20215;&#65292;&#39321;&#28207;&#25165;&#26377;&#23681;&#26376;&#38745;&#22909;&#65292;&#24066;&#27665;&#25165;&#33021;&#23433;&#24515;&#29983;&#27963;&#12290;</p></div><span></span><div class="end-37GBinZ_"></div></div></div>