基础三大类层级://跳级,/直接子类,..上一级属性:@属性访问函数:text()获取文字,@href获取href属性值使用方法#获取含有class="nav"的div标签下的文本//div[@class="nav"]/text()#获取<divid="link">...</div>——>ul——>li——>a的title属性//div[@id="link"]/ul/li/a/@title#获取<divid="link">...</div>——>ul——>第二个li——>a的href属性//div[@id="link"]/ul/li[2]/a/@href测试代码fromlxmlimportetreetext="""<divclass="wrapper"><divclass="nav">新浪微博</div><divid="link"><ulid=""><li><ahref="#"title="国内">国内</a></li><li><ahref="#"title="国际">国际</a></li><li><ahref="#"title="军事">军事</a></li></ul></div></div>"""#创建html对象html=etree.HTML(text)#获取含有class="nav"的div标签下的文本results=html.xpath('//div[@class="nav"]/text()')print(results)#获取<divid="link">...</div>——>ul——>li——>a的title属性results2=html.xpath('//div[@id="link"]/ul/li/a/@title')print(results2)#获取<divid="link">...</div>——>ul——>第二个li——>a的href属性results3=html.xpath('//div[@id="link"]/ul/li[2]/a/@href')print(results3)运行结果['新浪微博']['国内','国际','军事']['#']
斐波那契数列0,1,1,2,3,5,8,13,21,34….前两个数相加,是第三个数的值假如我需要一亿甚至十亿个数,如果使用range()生成,使用一个list()储存。我们使用迭代器设置好生成的方法,什么使用我们什么时候生成,这样可以节约内存斐波那契数列案例需要一个列表存储生成的数字maxCount=100000#需要生成的个数count=0#记录生成的次数startOne=0#斐波那契数列第一个起始值startTwo=1#斐波那契数列第二个起始值fibonacciList=list()whilecount<maxCount:fibonacciList.append(startOne)startOne,startTwo=startTwo,startOne+startTwocount+=1fornuminfibonacciList:print(num)加入迭代器这个过程没有一个列表classFibonacci(object):def__init__(self,allNum):self.allNum=allNum#需要生成的个数self.count=0#记录生成的次数self.startOne=0#斐波那契数列第一个起始值self.startTwo=1#斐波那契数列第二个起始值def__iter__(self):returnselfdef__next__(self):ifself.count<self.allNum:#记录斐波那契数fiboNum=self.startOne#计算斐波那契数self.startOne,self.startTwo=self.startTwo,self.startOne+self.startTwo#生成次数self.count+=1returnfiboNumelse:#自定义一个异常停止循环raiseStopIteration#传入生成个数fibo=Fibonacci(10000)#一个对象可以使用for循环fornuminfibo:print(num)Python迭代器原理简述
迭代器迭代器就是可以使用for循环的对象,list、str、tuple….那怎样才能实现这样的迭代?nums=[12,13,14]strs="python"tuples=(1,2,3,4,5)fornuminnums:print(num)一个对象可迭代的条件需要这个对象有__iter__()方法classClassmate(object):#有了这个方法该类就是可迭代的def__iter__(self):pass添加一个列表和添加方法给Classmate类classClassmate(object):def__init__(self):#存储self.namesList=list()defadd(self,other):#添加到列表里self.namesList.append(other)#有了这个方法该类就是可迭代的def__iter__(self):pass迭代器一个对象有__iter__()和__next__()方法叫迭代器如果使该对象可以返回迭代的数据:就需要一个迭代器的__next__()方法定义一个迭代器类classClassIterator(object):def__iter__(self):passdef__next__(self):pass完善一个可以执行的迭代器迭代对象的__iter__()方法需要返回一个迭代器对象#可迭代对象classClassmate(object):def__init__(self):self.namesList=list()defadd(self,other):self.namesList.append(other)#有了这个方法该类就是可迭代的def__iter__(self):#需要反对一个迭代器对象#把self传给迭代器,使迭代器可以获取self.namesListreturnClassIterator(self)#迭代器对象classClassIterator(object):def__init__(self,obj):self.nameList=obj.namesList#记录循环的次数self.count=0def__iter__(self):passdef__next__(self):ifself.count<len(self.nameList):name=self.nameList[self.count]self.count+=1returnnameelse:#自定义一个异常停止循环raiseStopIteration#主函数classmate=Classmate()#实例化对象classmate.add("小小")classmate.add("大大")classmate.add("中中")#for循环对象fornameinclassmate:print(name)把迭代对象类和迭代器类合并迭代对象和迭代器是两个类,那是否可以合并classClassmate(object):def__init__(self):self.namesList=list()self.count=0defadd(self,other):self.namesList.append(other)#有了这个方法该类就是可迭代的def__iter__(self):#需要反对一个迭代器对象#把列表传给迭代器returnselfdef__next__(self):ifself.count<len(self.namesList):name=self.namesList[self.count]self.count+=1returnnameelse:#自定义一个异常停止循环raiseStopIteration
CrawlSpider简介Spider可以做很多爬虫了,但是CrawlSpider是为全站爬取而生创建CrawlSpider爬虫工程scrapystartprojectwxapp创建CrawlSpider爬虫scrapygenspider-tcrawl[爬虫名称][爬取网站的域名]scrapygenspider-tcrawlwxapp_spiderwxapp-union.com修改settings.py设置#设置user-agent#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agentUSER_AGENT=''#关闭机器人协议#Obeyrobots.txtrulesROBOTSTXT_OBEY=False#设置延迟#Configureadelayforrequestsforthesamewebsite(default:0)#Seehttps://docs.scrapy.org/en/latest/topics/settings.html#download-delay#SeealsoautothrottlesettingsanddocsDOWNLOAD_DELAY=1#设置headers#Overridethedefaultrequestheaders:DEFAULT_REQUEST_HEADERS={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':'en',}#开启pipelines文件写入#Configureitempipelines#Seehttps://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={'wxapp.pipelines.WxappPipeline':300,}制定Items传输打开items.pyclassWxappItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()#文章标题title=scrapy.Field()#文章内容article=scrapy.Field()编写获取页面和文章链接的规则进入/spiders目录,查看wxapp_spider.py的爬虫类是继承于CrawlSpider类可在rules=()里定义多个Rule()规则Rule()参数详解:LinkExtractor(allow=r’匹配规则’):指定在页面里匹配链接的规则,支持正则表达式callback=’函数名称’:匹配到链接所执行的函数follow=True:爬取了匹配的页面后,是否在匹配页面再进行匹配(可实现翻页操作)name='wxapp_spder'allowed_domains=['www.wxapp-union.com']start_urls=['http://www.wxapp-union.com/portal.php?mod=list&catid=1&page=1']rules=(#设置匹配页数的规则(可以设置多个匹配连接的Rule())Rule(#页数的连接的匹配规则(支持正则表达式)LinkExtractor(allow=r'.+mod=list&catid=1&page=\d+'),#匹配到链接进行解析的函数follow=True),#匹配文章页面链接Rule(#匹配文章链接LinkExtractor(r'http://www.wxapp-union.com/article-(.*)-(.*)\.html'),#匹配到文章链接的解析函数callback='parse_article',follow=False,))添加解析文章页面的函数parse_article()导入fromwxapp.itemsimportWxappItemdefparse_item(self,response):pass#print(response.url)defparse_article(self,response):title=response.xpath('//div[@class="hhmcl"]/div/h1/text()').get()articleList=response.xpath('//td[@id="article_content"]//text()').getall()article="".join(articleList).split()#拼接返回的列表,去除前后空白字符yieldWxappItem(title=title,article=article)存储爬取数据打开pipeline.py文件导入fromscrapy.exportersimportJsonLinesItemExporter模块classWxappPipeline(object):defopen_spider(self,spider)::#以二进制方式打开文件self.ft=open('articleInfo.json','wb')self.exporter=JsonLinesItemExporter(self.ft,ensure_ascii=False,encoding='utf-8')defclose_spider(self,spider):self.ft.close()defprocess_item(self,item,spider):self.exporter.export_item(item)returnitem运行爬虫scrapycrawlwxapp_spider
Python模块安装源阿里云:http://mirrors.aliyun.com/pypi/simple/豆瓣:http://pypi.douban.com/simple/清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/(推荐)中国科学技术大学:https://pypi.mirrors.ustc.edu.cn/simple/官方默认安装源https://pypi.org/simple(国外)pipenv使用0x00全局Python安装pipenv模块0x01pycharm创建项目设置pipenv管理0x02修改安装模块源为国内的0x03安装模块的方式1、在Pycharm的设置里进行安装2、Pycharm的Terminal下使用pipenvinstall包名安装模块,pipenvuninstall包名卸载模块0x04注意事项及好处不能用pip安装不然Pipfile和Pipfile.lock就不会记录模块的数据了在移交项目时直接把源码、Pipfile和Pipfile.lock移交然后用在与上面文件的同级目录下使用pipenvinstall就可以快速安装所需模块