php|architect’s Guide to Web Scraping with PHP Matthew Turland php|architect’s Guide to Web Scraping with PHP byMatthewTurland php|architect’sGuidetoWebScraping ContentsCopyright©2009–2010MatthewTurland–AllRightsReserved Bookandcoverlayout,designandtextCopyright©2004-2010MarcoTabini&Associates,Inc.–AllRightsReserved FirstEdition:March2010 ISBN:978-0-9810345-1-5 ProducedinCanada PrintedintheUnitedStates Nopartofthisbookmaybereproduced,storedinaretrievalsystem,ortransmittedinanyformor bymeanswithoutthepriorwrittenpermissionofthepublisher,excetinthecaseofbriefquotations embeddedincriticalreviewsorarticles. Disclaimer Althougheveryefforthasbeenmadeinthepreparationofthisbooktoensuretheaccuracyofthe informationcontainedtherein, thisbookisprovided”as-is”andthepublisher, theauthor(s), their distributorsandretailers,aswellasallaffiliated,relatedorsubsidiarypartiestakenoresponsibility foranyinaccuracyandanyandalldamagescaused,eitherdirectlyorindirectly,bytheuseofsuch information. Wehaveendeavouredtoproperlyprovidetrademarkinformationonallcompaniesand productsmentionedinthebookbytheappropriateuseofcapitals.However,wecannotguaranteethe accuracyofsuchinformation. MarcoTabini&Associates,TheMTAlogo,php|architect,thephp|architectlogo,NanoBookandthe NanoBooklogoaretrademarksorregisteredtrademarksofMarcoTabini&Associates,Inc. Writtenby MatthewTurland Publishedby MarcoTabini&Associates,Inc. 28BombayAve. Toronto,ONM3H1B7 Canada (416)630-6202/(877)630-6202 [email protected]/www.phparch.com Publisher MarcoTabini TechnicalReviewer LukeGiuliani LayoutandDesign ArbiArzoumani ManagingEditor BethTuckerLong FinanceandResourceManagement EmanuelaCorso Coverpicture VladimirFofanov > m o c k. o o b e w o w w. w w < k o o B e w! o W m o d fr a o nl w o D > m o c k. o o b e w o w w. w w < k o o B e w! o W m o d fr a o nl w o D Contents Credits xiii Foreword xvii > m o c Chapter1—Introduction 1 k. o IntendedAudience . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 bo e HowtoReadThisBook. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 w o w WebScrapingDefined . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 w. w ApplicationsofWebScraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 w < AppropriateUseofWebScraping . . . . . . . . . . . . . . . . . . . . . . . . . 4 k o o LegalityofWebScraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 B e TopicsCovered . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 w! o W m Chapter2—HTTP 7 o Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 d fr a o GETRequests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 nl w AnatomyofaURL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 o D QueryStrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 POSTRequests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 HEADRequests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Responses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Headers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Redirection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 vi ” CONTENTS ReferringURLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 PersistentConnections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 ContentCaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 UserAgents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Ranges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 BasicHTTPAuthentication . . . . . . . . . . . . . . . . . . . . . . . . . . 20 DigestHTTPAuthentication . . . . . . . . . . . . . . . . . . . . . . . . . 21 Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Chapter3—HTTPStreamsWrapper 27 SimpleRequestandResponseHandling . . . . . . . . . . . . . . . . . . . . . 28 StreamContextsandPOSTRequests . . . . . . . . . . . . . . . . . . . . . . . 29 ErrorHandling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 HTTPAuthentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 m> o AFewMoreOptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 c k. o Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 o b e w o Chapter4—cURLExtension 35 w w. SimpleRequestandResponseHandling . . . . . . . . . . . . . . . . . . . . . 36 w w ContrastingGETandPOST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 < k o SettingMultipleOptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 o B HandlingHeaders. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 w! e Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 o W Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 m o HTTPAuthentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 d fr a Redirection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 o nl w Referers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 o D ContentCaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 UserAgents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 ByteRanges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 DNSCaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Timeouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 RequestPooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 CONTENTS ” vii Chapter5—pecl_httpPECLExtension 49 GETRequests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 POSTRequests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 HandlingHeaders. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Timeouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 ContentEncoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 HTTPAuthentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 RedirectionandReferers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 ContentCaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 UserAgents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 ByteRanges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 > RequestPooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 m o c Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 k. o o b e Chapter6—PEAR::HTTP_Client 61 w o RequestsandResponses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 w w. JugglingData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 w w < WranglingHeaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 k o UsingtheClient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Bo e ObservingRequests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 w! o Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 W m o Chapter7—Zend_Http_Client 71 d fr a BasicRequests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 o nl w Responses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 o D URLHandling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 CustomHeaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Connectivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Redirection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 UserAgents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 viii ” CONTENTS HTTPAuthentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Chapter8—RollingYourOwn 81 SendingRequests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 ParsingResponses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 TransferEncoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 ContentEncoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Timing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Chapter9—TidyExtension 89 Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Tidy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 > m Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 o c k. Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 o o b Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 e w o Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 w w. Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 w w < k Chapter10—DOMExtension 99 o o B TypesofParsers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 e w! LoadingDocuments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 o W TreeTerminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 m o ElementsandAttributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 d fr LocatingNodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 a o nl XPathandDOMXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 w o AbsoluteAddressing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 D RelativeAddressing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 AddressingAttributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 CONTENTS ” ix Chapter11—SimpleXMLExtension 113 LoadingaDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 AccessingElements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 AccessingAttributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 ComparingNodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 DOMInteroperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Chapter12—XMLReaderExtension 121 LoadingaDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 ElementsandAttributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 m> o DOMInteroperation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 c k. o ClosingDocuments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 o b e Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 w o w w. Chapter13—CSSSelectorLibraries 129 w w ReasontoUseThem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 < k o Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 o B HierarchicalSelectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 w! e BasicFilters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 o W ContentFilters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 m o AttributeFilters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 d fr a ChildFilters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 o nl w FormFilters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 o D Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 PHPSimpleHTMLDOMParser . . . . . . . . . . . . . . . . . . . . . . . 138 Zend_Dom_Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 phpQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 DOMQuery. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Wrap-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Description: